在 python 中解析数据文件时出现 KeyError
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。
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]
,然后才能向其添加映射
您的词典还没有关键字,因此 data[user]
将不存在。您可以 Python 使用 dict.setdefault()
方法为缺少的键添加默认值:
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
模块来处理选项卡上的拆分。
你试试,设置更新词典,那个不存在。所以你必须在使用之前为每个用户生成一个字典。最好,使用 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
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。
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]
,然后才能向其添加映射
您的词典还没有关键字,因此 data[user]
将不存在。您可以 Python 使用 dict.setdefault()
方法为缺少的键添加默认值:
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
模块来处理选项卡上的拆分。
你试试,设置更新词典,那个不存在。所以你必须在使用之前为每个用户生成一个字典。最好,使用 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