我在python中解析数据文件时遇到KeyError

时间:2016-11-02 18:13:55

标签: 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

我在解析文件时遇到了KeyError。

3 个答案:

答案 0 :(得分:2)

你的词典还没有键,所以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模块来处理标签上的拆分。

答案 1 :(得分: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)}

您必须先定义字典prefs[user],然后才能向其添加映射

答案 2 :(得分:0)

您尝试设置不存在的更新词典。因此,您必须在使用之前为每个用户生成字典。最好,使用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