我遇到了这段代码的问题。虽然名称错误似乎很普遍,但我无法通过搜索找到解决方法。这是代码......
def fmp_sel():
with open ('MonPlotDb.csv', 'rU') as csvfile:
next(csvfile, None)
fmpList = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab)
for item in enumerate(fmpList):
print "[%d] %s" % (item)
while True:
try:
in_Sel = raw_input(('''Choose from list or 'q' to quit:'''))
if in_Sel == 'q':
print 'Quit?'
conf = raw_input('Really? (y or n)...')
if conf == 'y':
print 'Seeya!'
break
else:
continue
plotOrig = DataPlotLoc[int(in_Sel) + 1]
print 'You selected', plotOrig[1]
break
except (ValueError, IndexError):
print 'Error: Try again'
和追溯......
File "E:\FireRegDb\Rec_2012\dblist_outonly.py", line 28, in fmp_sel
plotOrig = DataPlotLoc[int(in_Sel) + 1]
NameError: global name 'DataPlotLoc' is not defined
这个函数是从main()调用的,但我不明白为什么'DataPlotLoc'是一个全局名称,因为它在这个函数中。无论哪种方式,我想我错过了一条线来定义它,但我不知道如何以及在哪里。我很乐意帮忙。
编辑: 只是添加更多信息..'DataPlotLoc'是插入代码时列表的名称,即。 DataPlotLoc = [['a','b','c',....]]并且它有效。这条线 plotOrig = DataPlotLoc [int(in_Sel)+ 1]引用此列表,但显然它现在被csv.reader读入,所以现在我不知道如何分配这个变量。 我假设在确认用户是否输入'q'之后仍然需要它接受一个整数,并且+1是要添加到输入的数字,所以它与从列表中选择的相应行项的正确索引号一致。 对不起,如果这有点令人困惑,但我自己有点困惑......
答案 0 :(得分:2)
好吧,正如错误消息所示,您在定义它之前使用DataPlotLoc
。如果您搜索代码,您将看到它从未在任何地方定义过。在不知道你的意思的情况下,不能真正回答这个问题。
Python假设您指的是该名称的全局变量,因为您从未向其分配任何内容,这会使其成为局部变量。
答案 1 :(得分:0)
Python正在说global name ... not defined
因为它没有在函数体中看到DataPlotLoc
的任何赋值,所以它假定它必须是一个全局变量,并且无法在那里找到它。 (见下文abarnert的评论)
根据您的代码判断,我想您希望DataPlotLoc
包含您从MonPlotDb.csv
中提取的信息,在这种情况下,您需要做两件事:
(A)初始化DataPlotLoc
def fmp_sel():
DataPlotLoc = [] # <-----------------!!!!
with open ('MonPlotDb.csv', 'rU') as csvfile:
(B)在循环和打印选项时将值附加到DataPlotLoc
。
next(csvfile, None)
fmpList = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab)
for item in enumerate(fmpList):
DataPlotLoc.append(item[1]) # <---------!!!
print "[%d] %s" % (item)
我不确定为什么要在plotOrig = DataPlotLoc[int(in_Sel) + 1]
的行中添加一个,我认为您可以将csv.reader
行简化为以下csv.reader(csvfile)
(我认为excel用逗号是默认行为)
修改:要从CSV的每一行中仅提取一列,请将B部分中的代码更改为以下内容:
next(csvfile, None)
fmpList = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab)
for item in enumerate(fmpList):
i, data = item # enumerate returns tuples of the form (i, data)
vals = (i, data[1]) # <----- put in the proper index of the column
DataPlotLoc.append(vals)
print "[%d] %s" % vals # <--- assuming you want to change the print as well