我想要实现的目标是仅从大型csv文件中读取我想要的特定数据。为此,我有一个主菜单,我用作数据采集的处理程序,然后单独的菜单退出或继续。当我在循环遍历文件一次后尝试读取更多数据时,我的问题就出现了。问题是我已经到达文件的末尾,并且由于某种原因,for循环没有正确处理StopIterator错误。有什么建议?提前谢谢!
fname = open(current_file, 'r')
reader = csv.reader(fname)
for row in reader:
list_header = row
break
def main_menu():
i=0
menu = {}
print reader
for hdr in list_header:
menu[str(i)]=hdr
i+=1;
options=menu.keys() #creates a list out of the keys
options.sort()
for entry in options:
print entry, menu[entry]
selection=raw_input("Please Select:")
data=[]
for row in reader:
a=0
for block in row:
if a==list_header.index(menu[selection]):
data.append(block)
a+=1
print 'Saving '+menu[selection]+' values into an array.'+'\n'
return data
def continue_menu():
menu_1={}
menu_1['0']='Continue'
menu_1['1']='Exit'
options=menu_1.keys()
options.sort()
for entry in options:
print entry, menu_1[entry]
selection=raw_input('Please Select:')
if float(selection)==0:
print 'As you wish'+'\n'
proceed=True
else:
proceed=False
return proceed
proceed=True
while proceed:
data1=main_menu()
proceed=continue_menu()
答案 0 :(得分:1)
csv.reader
从文件对象中读取行并将它们分成行。当你到达文件末尾时,StopIteration
被引发,for
循环捕获该异常并且循环停止。现在文件指针位于文件的末尾。如果您尝试再次迭代它,它已经在最后并立即引发StopIteration
。请注意,在示例中,第二次通过循环
>>> import csv
>>> fname=open('a.csv')
>>> reader = csv.reader(f)
>>> for row in reader:
... print(row)
...
['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
>>> for row in reader:
... print(row)
...
>>>
一种解决方案是将文件指针倒回到文件的开头。现在,循环再次起作用
>>> fname.seek(0,0)
0
>>> for row in reader:
... print(row)
...
['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
另一种更常用的解决方案是在迭代之前打开文件。通过使用while
,文件在使用后立即关闭,下次运行循环时,文件将被打开并再次迭代。
>>> with open('a.csv') as fname:
... for row in csv.reader(fname):
... print(row)
...
['1', '2', '3']
['4', '5', '6']
['7', '8', '9']