2016-05-02 13 views
3

動物(クマ、オオカミなど)の数を数え、変数に入れるプログラムを作成しようとしています。python 2.7ファイルの難易度

これは、プログラムが最初の行はサーモンを==ことを登録していないいくつかの理由について

import os 
def count_species(): 
    sal_count = 0 
    tro_count = 0 
    filename1 = animals.txt 
    if os.path.exists(animals.txt): 
     f = open(filename1, 'r') 
     for line in f:#will execute each line in the file individually 
      if line == 'Salmon': 
       sal_count +=1 
      if line == 'Trout': 
       tro_count += 1 

が機能していません。他のすべてがうまくいくようです。ファイルの例を以下に示します

Salmon 
Trout 
Salmon 

何が起こっていますか?あなたは内のファイルを読み取り、ファイルやチェックの行を反復処理している

答えて

3

:行は必ずしもこれではないかもしれない

if line == 'Salmon': 
    .... 
if line == 'Trout': 
    .... 

、それは最後に改行文字を持つことができます(それがしますここに)。ファイルを読み込み、改行文字を取り除きます。これを行うには

一つの方法:

with open(path to file, "r") as f: 
    lines = [x.strip() for x in f] 
    .... 

また、ファイルを閉じることはありません。コンテキストマネージャを使用すると、すべてを処理することを心配する必要はありません。

また、恐らく2つのifステートメントをここで使用したくないかもしれません。

+0

+1の 'with'とリストの理解 - コードを読みやすく、より洗練され、よりエレガントにします。 OPが2つの 'if '文を使わないようにする方法を追加することを考えてください。例えば、' sal_count = lines.count(' Salmon ') 'を使うことです。 –

+0

readlineを呼び出す必要はありません。 –

0

あなたはそれらを見ていないかもしれないが、あなたの最初の行は、それはまた、あなたが押すから取得するには、たとえば、ENTER(「\ n」はまたは改行が含まれているだけのように正確に文字列Salmonではありません。

使用strip()あなたのケースでは、lineある文字列から(それがあなたの改行を含んで)空白を削除します。以下の変更:

if line == 'Salmon': 
    ... 
if line == 'Trout': 
    ... 

if line.strip() == 'Salmon': 
    ... 
if line.strip() == 'Trout': 
    ... 

に@Pythonistaが言ったように。また、常にあなたのファイルを閉じます。最後にf.close()のようなものを追加するか、with open("filename.txt", "r") as f: ...

0

のような行を追加してください。

if 'Salmon' in line: 
    sal_count +=1 
if 'Trout' in line: 
    tro_count += 1