Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';我在用python解析数据文件时遇到了KeyError_Python_Parsing_Keyerror - Fatal编程技术网

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