2016-11-07 2 views
0

ファイルから読み込み、その内容を辞書として返すのに問題があります。各ファイルには\ nで区切られた数字が含まれています。目標は各数字をキーとして返す数値を数え、キーの値はファイル内の数値です。Python - ファイルから数値のリストを取得し、dict表現として返します

例:filea.txtが含まれている場合filea.txtfileb.txt"13\n13\n13\n13\n13\n13\n13\n13\n"機能はここ{13:8}

を返す必要が含まれている場合"100\n100\n3\n100\n9\n9\n"機能は{100:3, 3:1, 9:2} を返す必要が含まれている場合 "1\n1\n1\n2\n3\n3\n3\n3\n5\n"機能が {1:3,2:1,3:4,5:1}
を返す必要があります私の現在の試みです:

def file_counts(filename): 
    a = open('filea.txt') 
    b = open('fileb.txt') 
    info = a.read() 
    info2 = b.read() 
    a.close() 
    b.close() 
    if info == True: 
     return (dict(collections.Counter(info))) 
    elif info2 == True: 
     return (dict(collections.Counter(info2))) 
    else: 
     return None 

現在のところ、このようなファイルやディレクトリはエラーではありません。さまざまなテストケースでファイルの内容が変化するためです。したがって、fileaは異なる情報を含むことができ、関数はこれを考慮する必要があります。このエラーが発生した場合openが一致して現在の作業ディレクトリ内のファイルを見つけることができないので、それは

IOError: [Errno 2] No such file or directory: 'filea.txt' 

:あなたの文から

答えて

1

このようなもので十分です。検証は行われていないことに注意してください。例:空白行、数字以外の文字。あなたの質問では、数値が整数に変換されるべきであるように思われますが、あなたのコードはそうではありません。

from collections import Counter 

def file_counts(filename): 
    # Open file for reading 
    with open(filename, 'r') as file: 
     data = [] 
     # Go through each line of the file 
     for line in file: 
      value = int(line) 
      data.append(value) 

     return dict(Counter(data)) 

if __name__ == '__main__': 
    filename = 'testfile.txt' 
    print(file_counts(filename)) 

問題はありましたか。

def file_counts(filename): 
    a = open('filea.txt') 
    b = open('fileb.txt') 

2つのファイルを読み込み、パラメータとして指定されたファイル名を無視しています。

info = a.read() 

これはファイル全体を読み込みますが、大容量ファイルの場合は通常これが最適ではありません。

if info == True: 

infoそれが文字列であるようTrueになることはありません。

return (dict(collections.Counter(info))) 

これは、しかし、それはまだ文字列であるとして、あなたは情報をフォーマットしていないので、あなたの辞書は\n文字が含まれ、それはそれぞれをカウントして、それを超える1つの文字と数字のために動作しない、一般的に大丈夫です個々の文字。

ほとんどの場合、IOErrorが発生します。ファイル名を使用する場合は、Pythonファイルと同じディレクトリにテキストファイルが必要です。それ以外の場合は、ファイルパスを指定する必要があります。

+0

なぜ私のコードがあなたのこれは本当に役に立ちました – n00bprogrammer22

0

に役立ちます誰のおかげで、私はあなたがIOErrorなどを受け取ったと仮定しますフェッチするように要求しているファイル名Pythonが正しいディレクトリで検索していることを確認するには、/home/username/project/filea.txtのようなファイル名の先頭にパスを追加する必要があります。

ファイルを開くことができ、IOErrorを過ぎると、コードにはいくつかの不具合があります。

まず、我々はcollections.Counter()は、文字列の各文字を解析し、それぞれの発生をカウントされ、見ることができるようにのはdict(collections.Counter(info))

>>> info = "100\n100\n3\n100\n9\n9\n" 
>>> dict(collections.Counter(info)) 
{'1': 3, '0': 6, '3': 1, '\n': 6, '9': 2} 

を見てみましょう。したがって、 '1'、 '0'、 '3'はそれぞれ3回カウントされるのではなく、3回カウントされます。あなたはまだあなたの入力した後、もし最後の文が、私は、あなたが最初にそれらで刺してみましょうよに関するいくつかのエラーを持っている

>>> info = info.strip()  # removes the last \n on the right 
>>> nums = info.split('\n') # breaks up the string into a list of elements 
>>> print(nums) 
['100', '100', '3', '100', '9', '9'] 
>>> print(dict(collections.Counter(nums))) 
{'9': 2, '100': 3, '3': 1} 

:以下のように代わりに、値のリストを作ることができます。 GL!

関連する問題