从文件中读取值的迭代器
iterator that reads values from file
是否可以使用迭代器从文件中读取值,以便在迭代结束时自动关闭文件?
使用 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
方法,它会像读取单个文件一样遍历它们的行。
是否可以使用迭代器从文件中读取值,以便在迭代结束时自动关闭文件?
使用 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
方法,它会像读取单个文件一样遍历它们的行。