2016-11-02 6 views
1
def loadMovieLens(path='C:\Users\karan\Desktop\ml-100k'): 
    # Load data 
    prefs={} 
    for line in open(path+'/new1.data'): 
     (user,title,rating,ts)=line.split('\t')[0:4] 
     prefs[user][title]=float(rating) 
    return prefs 

ファイルの解析中にKeyErrorが発生しました。私はPythonでデータファイルを解析中にKeyErrorを取得しています

+0

データファイルの内容を共有できますか? –

+2

'prefs [user]'は存在しません。あなたはそれを作らなければなりません。 –

+0

@PatrickHaughのように言った。 'prefs [user] = {}'のように 'prefs [user]'を作成することができます。 –

答えて

2

あなたの辞書には、キーを持っていない、まだ、そうdata[user]は存在しません、それにマッピングを追加することができます前に、辞書prefs[user]を定義する必要があります。あなたは、Pythonがdict.setdefault()メソッドを使用してキーを欠落しているため、デフォルト値を追加することができます:

prefs.setdefault(user, {})[title] = float(rating) 

上記そのキーが」doesnの場合userで指定されたキーの値として{}(空の辞書)を追加するprefsを伝えますまだ存在しない。いずれにしても、既存の値または新しい値が返されます。その後、いくつかの小さな改善を

、完全な機能は次のようになります。

def loadMovieLens(path='C:\Users\karan\Desktop\ml-100k'): 
    prefs = {} 
    with open(os.path.join(path, 'new1.data')) as f: 
     for line in f: 
      user, title, rating, ts = line.split('\t', 4)[:4] 
      prefs.setdefault(user, {})[title] = float(rating) 
    return prefs 

私は、(読み込みが完了したときにそのファイルが適切に閉じられている)with文を追加したパスを構築するためにos.path.join()を使用(それ現在のオペレーティングシステムとは独立したパス区切り文字を扱うことができます)、4回に制限されます。

csvモジュールに切り替えると、タブでの分割も処理できます。

0
for line in open(path+'/new1.data'): 
     (user,title,rating,ts)=line.split('\t')[0:4] 
     if prefs[user]: 
      prefs[user][title]=float(rating) 
     else: 
      prefs[user] = {title: float(rating)} 

はあなたが

0

存在しない更新辞書を設定しようとしました。ですから、使用する前に各ユーザの辞書を生成しなければなりません。最高の場合、自動辞書生成のためdefaultdictを使用してください:

from collections import defaultdict 

def loadMovieLens(path=r'C:\Users\karan\Desktop\ml-100k'): 
    prefs = defaultdict(dict) 
    with open(os.path.join(path, 'new1.data')) as lines: 
     for line in lines: 
      user, title, rating, _ts = line.split('\t', 3) 
      prefs[user][title] = float(rating) 
    return prefs 
関連する問題