在 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