Ern*_*t A 1 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
Run Code Online (Sandbox Code Playgroud)
如果你想使用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)
Run Code Online (Sandbox Code Playgroud)
但是,如果您没有到达此迭代器的末尾,您将永远不会关闭该文件,因此本质上它与以下内容没有太大区别:
file = open(filename,'rb')
next(file)
file.close()
Run Code Online (Sandbox Code Playgroud)
处理文件时,如果可以的话,最好一次浏览所有文件,然后在使用完毕后将其关闭。保留打开文件的句柄通常不是可靠的解决方案。