2016-03-21 7 views
-1

ファイルを読み込むためのPythonコードを書き、コンテンツから辞書を作成して繰り返し単語の数を確認しようとしています。コードは次のとおりです。各ステップについてのコメントがあります。辞書にファイルを読み込んで繰り返し単語の数を確認する

import string 

# making a dictionary from a paragraph 
def make_dict(s): 
    some_list = s.split() 
    d = dict() 
    for word in some_list:    
     d[word] = 1 + d.get(word,0) 
    print d 
    print 
    print 
    return d 

#Inverse the dictionary 
# swap between key and value 

def invert_dict(s): 
    inverse = {} 
    d = make_dict(s) 
    for key in d: 
     val = d[key] 
     if val not in inverse: 
      inverse[val] = [key] 
     else: 
      inverse[val].append(key) 
    print inverse 
    print 
    print 
    return inverse 


# Reading a file and copying just plain text in other file  
def make_text(): 
    file_name = raw_input('Enter file name: ') 
    fn = open(file_name) 
    for line in fn: 
     line = line.translate(None,"!#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~") 
     line = line.lower() 
     some_text = open('duplicate.txt','a') 
     some_text.write(line) 
     # print some_text 
     some_text.close() 
     fn.close() 
     return some_text 


some_file = make_text() 
some_dict = invert_dict(some_file) 
for key in some_dict: 
    print key , some_dict[key] 
    print 

コードを実行すると、次のエラーが発生します。誰かが私が間違っていることを説明するのを手伝ってもらえますか?エラーを修正する方法は?

Traceback (most recent call last): 
    File "C:\Users\KUMAR\Desktop\Python practice\DataStructureSelectionb\string_to_dictionary.py", line 51, in <module> 
    some_dict = invert_dict(some_file) 
    File "C:\Users\KUMAR\Desktop\Python practice\DataStructureSelectionb\string_to_dictionary.py", line 22, in invert_dict 
    d = make_dict(s) 
    File "C:\Users\KUMAR\Desktop\Python practice\DataStructureSelectionb\string_to_dictionary.py", line 8, in make_dict 
    some_list = s.split() 
AttributeError: 'file' object has no attribute 'split' 

答えて

0

あなたmake_text機能は、あなたが期待するように見えるように、それは、ない文字列に書かれた(閉じた状態)ファイルオブジェクトを返します。代わりにlineを返すことをお勧めしますか?

実際にループ内から戻ってくるのかどうかは、ユーザーがあなたの名前を付けたファイルの最初の行だけを処理するので不明です。単一行ではなく、ファイル全体を読みたい場合は、fn(ファイル名ではなく、ファイルオブジェクトであるため、少し誤解を招く人がいます)を反復するのではなく、fn.read()を呼び出します。あるいは、make_textをジェネレータ関数にすることもできますが、各行にyieldを入れることもできます(ただし、これは他のコードに大きな変更を必要とします)。

関連する問題