[英]I'm getting KeyError while parsing a data file in python
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。
您的字典尚無鍵,因此data[user]
將不存在。 您可以使用dict.setdefault()
方法讓Python為缺少的鍵添加默認值:
prefs.setdefault(user, {})[title] = float(rating)
上面的代碼告訴prefs
如果user
尚未在密鑰中添加{}
(空字典)作為該密鑰的值。 無論哪種方式,都將返回現有值或新值。
經過一些小的改進,完整的功能將變為:
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
模塊來處理選項卡上的拆分。
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)}
您必須先定義字典prefs[user]
然后才能向其中添加映射
您嘗試設置更新字典,該字典不存在。 因此,您必須為每個用戶生成一個字典,然后再使用它。 最好,使用defaultdict
來自動生成dict:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.