I';我在用python解析数据文件时遇到了KeyError
我在分析文件时遇到一个键错误I';我在用python解析数据文件时遇到了KeyError,python,parsing,keyerror,Python,Parsing,Keyerror,我在分析文件时遇到一个键错误 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 您必须先定义字
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
您必须先定义字典
prefs[user]
,然后才能向其添加映射您的字典还没有键,因此数据[user]
将不存在。您可以让Python使用dict.setdefault()
方法为缺少的键添加默认值:
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
中指定的键的值(如果该键尚不存在)。无论哪种方式,都会返回现有值或新值
通过一些小的改进,完整的功能将变为:
prefs.setdefault(user, {})[title] = float(rating)
我添加了一个with
语句(这样在读取完成时文件会正确关闭),使用os.path.join()
构建路径(这样它可以独立于当前操作系统处理路径分隔符),并将拆分限制为4次
您也可以切换到
csv
模块来处理选项卡上的拆分。您尝试设置不存在的更新词典。因此,在使用字典之前,您必须为每个用户生成一个字典。最好使用defaultdict
自动生成dict:
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
您可以共享数据文件内容吗?
prefs[user]
不存在。你必须做到,就像帕特里克豪说的。您可以像这样创建prefs[user]
prefs[user]={}
。
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