从文件中读取值的迭代器

时间:2017-09-20 10:12:59

标签: python io iterator with-statement

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

使用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                                        

2 个答案:

答案 0 :(得分:2)

如果您想使用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()

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

答案 1 :(得分:1)

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

import fileinput

files = ['path to file']

iterator = fileinput.input(files)

for line in iterator:
    print(line)

您可以为input方法提供多个文件路径列表,它会像读取单个文件一样迭代它们的行。