从文件读取值的迭代器

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)

Fly*_*see 5

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

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