从文件中读取值的迭代器



是否可以使用迭代器从文件读取值,以便在迭代结束时自动关闭文件?

使用with语句创建这样的迭代器似乎不起作用。

with open('/dev/zero', 'rb') as f:                                              
    values = iter(f.read(1) for i in (1, 2, 3))                                 
values.next()             #ValueError: I/O operation on closed file                                        

如果要使用with,则需要做:

def file_generator(filename):
    with open(filename,'rb') as file:
        for i in (1, 2, 3):
            yield file.read(1)
values = file_generator('/dev/zero')
next(values)

但是,如果您没有到达此迭代器的末尾,您将永远不会关闭文件,因此,从本质上讲,它与:

并没有很大不同。
file = open(filename,'rb')
next(file)
file.close()

处理文件时,最好如果可以的话,最好一次通过所有内容,然后在使用它完成后将其关闭。在打开文件上保持手柄通常不是可靠的解决方案。

fileInput模块为您做到这一点。打开和关闭文件将自动处理。

import fileinput
files = ['path to file']
iterator = fileinput.input(files)
for line in iterator:
    print(line)

您可以将多个文件路径的列表列出到input方法,它将像读取单个文件一样在线路上迭代。

最新更新