在python csv模块中处理reader对象的问题

时间:2016-03-22 02:54:09

标签: python loops csv exception-handling

我想要实现的目标是仅从大型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()

1 个答案:

答案 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']