用Python打开.csv文件出错

用Python打开.csv文件出错,python,Python,我在一本书中引用了一个例子,收到了一个错误。我有两个文件。一个名为nobel_winners.csv,另一个名为test.py我正在尝试从test.py打开nobel_winners.csv nobel_winners.csv的内容如下: nobel_winners = [ {'category': 'Physics', 'name': 'Albert Einstein', 'nationality': 'Swiss', 'sex': 'male', 'year': 1921}

我在一本书中引用了一个例子,收到了一个错误。我有两个文件。一个名为nobel_winners.csv,另一个名为test.py我正在尝试从test.py打开nobel_winners.csv

nobel_winners.csv的内容如下:

nobel_winners = [
 {'category': 'Physics',
  'name': 'Albert Einstein',
  'nationality': 'Swiss',
  'sex': 'male',
  'year': 1921},
 {'category': 'Physics',
  'name': 'Paul Dirac',
  'nationality': 'British',
  'sex': 'male',
  'year': 1933},
 {'category': 'Chemistry',
  'name': 'Marie Curie',
  'nationality': 'Polish',
  'sex': 'female',
  'year': 1911}
]
在test.py中,我使用的是
f=open('nobel\u winners.csv','w')
然后是
cols=nobel\u winners[0].keys()。然后程序抛出:

NameError:未定义“诺贝尔奖获得者”的名称


这里出了什么问题?

我认为这是因为变量“诺贝尔奖获得者”在你称之为“诺贝尔奖获得者”之前没有定义

我不知道你的代码,但如果你是从csv阅读,下面的代码对我有用。不过,这不是最好的办法。我是在这个网站上发布的一个问题的指导下做的

def read_from_csv(filename,nrows,ncols):
csv_data = np.zeros((nrows,ncols))

with open(filename,'rb') as csvfile:
  read_csv = csv.reader(csvfile)
  i=0
  for row in read_csv:
      csv_data[i] = np.array(row)
      csv_data[i] = csv_data[i].astype(np.float)
      i += 1
csvfile.close()
return csv_data

您有f=文件的打开,但在使用cols调用它之前,没有将nobel_winners作为变量引用=


在将变量赋给另一个变量之前,请确保已设置该变量

您的代码中有多处不正确

  • 输入文件不是csv。它有一个变量=字典列表 格式。将输入文件格式转换为JSON。试着读一下 代码中的JSON数据
  • 您正在以写入模式打开文件,并且 试着读它。出现
    名称错误的原因是您
    希望输入文件中的
    诺贝尔奖获得者
    将被转换 添加到代码中的变量。但它不会
也就是说,要使当前输入文件和代码正常工作,可以将输入文件重新定义为

[
 {'category': 'Physics',
  'name': 'Albert Einstein',
  'nationality': 'Swiss',
  'sex': 'male',
  'year': '1921'},
 {'category': 'Physics',
  'name': 'Paul Dirac',
  'nationality': 'British',
  'sex': 'male',
  'year': '1933'},
 {'category': 'Chemistry',
  'name': 'Marie Curie',
  'nationality': 'Polish',
  'sex': 'female',
  'year': '1911'}
]
然后使用以下代码

import ast
with open('data.csv', 'r') as myfile:
    data = myfile.read().replace('\n', '')
data_dict = ast.literal_eval(data)
cols =  data_dict[0].keys()
或者按照furas在评论中的建议,将输入文件视为常规python文件而不是csv文件(将其重命名为.py)。这样,您必须将代码更改为:

from nobel_winners import nobel_winners
cols =  nobel_winners[0].keys()

您需要将代码中的数据放在一个文件test.py中。脚本将写入文件data/nobel_winners.csv。正确的脚本如下所示:

f = open('data/nobel_winners.csv', 'w')

nobel_winners = [
 {'category': 'Physics',
  'name': 'Albert Einstein',
  'nationality': 'Swiss',
  'sex': 'male',
  'year': 1921},
 {'category': 'Physics',
  'name': 'Paul Dirac',
  'nationality': 'British',
  'sex': 'male',
  'year': 1933},
 {'category': 'Chemistry',
  'name': 'Marie Curie',
  'nationality': 'Polish',
  'sex': 'female',
  'year': 1911}
]

cols = nobel_winners[0].keys()
cols.sort()

with open('data/nobel_winners.csv', 'w') as f:
    f.write(','.join(cols) + '\n')

    for o in nobel_winners:
      row = [str(o[col]) for col in cols]
      f.write(','.join(row) + '\n')

 with open('data/nobel_winners.csv') as f:
    for line in f.readlines():
        print(line),

为什么该文件命名为.csv?另外,该文件似乎是一个有效的Python字典列表?你能控制文件名吗?因为这样你就可以把它变成一个.py,只需导入它并直接作为一个有效的Python数据结构使用。当你说
cols=nobel_winners[0]。keys()
nobel_winners
分配了什么?您可能没有根据错误定义该变量。您的
nobel_winners.csv
不是csv文件,而是普通Python文件。将其重命名为
nobel\u winners.py
并从nobel\u winners import*