使用Python打开.csv文件会引发NameError

时间:2016-11-04 01:44:30

标签: python

我在书中跟踪一个例子并收到错误。我有两个文件。一个名为nobel_winners.csv,另一个名为test.py,我试图从test.py中打开nobel_winners.csv。

nobel_winners.csv的内容是:

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

来自我的test.py,我正在使用cols = nobel_winners[0].keys(),然后是vim script :se ff=unix :wq 。然后程序抛出:

  

NameError:未定义名称'nobel_winners'。

这里出了什么问题?

4 个答案:

答案 0 :(得分:0)

我认为这是因为变量“nobel_winners”'在你打电话之前没有定义。

我不知道您的代码,但如果您正在阅读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

答案 1 :(得分:0)

你有f =文件的开头,但是在用cols =

调用之前没有将nobel_winners作为变量引用

确保在将变量分配给另一个变量之前设置变量。

答案 2 :(得分:0)

您的代码中存在多个不正确的内容。

  • 输入文件不是csv。它有一个变量=字典列表 格式。将输入文件格式转换为JSON。并尝试阅读 代码中的JSON数据。
  • 您正在以写入模式打开文件 试着读它。 NameError的原因是因为你是 希望转换输入文件中的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'}
]

然后使用以下代码

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()

或者如评论中建议的那样,将输入文件视为常规python文件而不是csv文件(将其重命名为.py)。这样您就必须将代码更改为:

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

答案 3 :(得分:0)

您需要将代码中的数据放在一个文件test.py中。该脚本写入文件数据/ 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),