NameError:为什么没有定义?

时间:2015-04-23 20:37:34

标签: python csv

对于此代码,我收到了一个未定义的错误:

  values = line.split(" ")  
NameError: name 'line' is not defined

我不确定为什么line没有定义。请有人帮帮我。这可能是愚蠢的事情,如果是因为它需要成为别的东西,有人可以告诉我这是什么吗?

with open("Class1.csv") as f:
    columns = f.readline().strip().split(" ")
    numRows = 0
    sums = [1] * len(columns)

    for line in f:
    # Skip empty lines
        if not line.strip():
            continue

values = line.split(" ") # This seems to be the problematic line.
for i in range(1,len(values)):

     sums[i] += int(values[i])
     numRows += 1

for index, i in enumerate (sums):
    print (columns[index], 1.0 * (i) / (numRows))

2 个答案:

答案 0 :(得分:1)

您的for循环根本没有循环,因此line标识符未被分配,从而导致错误。

您可能有一个单行文件,在循环之前已完全消耗。

注意:在python for循环和with语句中引入新范围!参见:

In [1]: for x in range(5):
   ...:     print(x)
   ...:     
0
1
2
3
4

In [2]: x   # here I can still use x!
Out[2]: 4

所以你所做的是完全有效的。问题是,如果for没有执行迭代,则会得到NameError

In [1]: for x in []:
   ...:     print('no iteration performed')

In [2]: x
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-401b30e3b8b5> in <module>()
----> 1 x

NameError: name 'x' is not defined

函数定义引入了新范围。

答案 1 :(得分:0)

values = line.split(" ") 

在你的for循环之外,所以你绝对不应该写那样的东西。

然而,从句法上来说,&#34; line&#34;将在第一次循环迭代后在全局范围中定义。在这种情况下,错误是因为你的for循环不会迭代一次(因为你的输入)。如果是的话,&#34; line&#34;将具有循环的最后一个值。

示例:

for a in range(2):
  pass
print (a)

将打印1

但是:

for a in range(0):
  pass
print (a)

将返回错误,因为a从未定义,范围(0)没有元素。

NameError: name 'a' is not defined