以下语法是否关闭文件:
lines = [line.strip() for line in open('/somefile/somewhere')]
如果你能证明它是如何做或不做的,那就加分……
蒂亚!
以下语法是否关闭文件:
lines = [line.strip() for line in open('/somefile/somewhere')]
如果你能证明它是如何做或不做的,那就加分……
蒂亚!
它应该关闭文件,是的,尽管它何时关闭取决于实现。原因是列表理解结束后没有对打开文件的引用,所以它将被垃圾收集,然后关闭文件。
在 CPython(来自 python.org 的常规解释器版本)中,它会立即发生,因为它的垃圾收集器通过引用计数工作。在另一个解释器中,例如 Jython 或 Iron Python,可能会有延迟。
如果您想确保您的文件被关闭,最好使用以下with
语句:
with open("file.txt") as file:
lines = [line.strip() for line in file]
结束with
后,文件将被关闭。即使在其中引发异常也是如此。
你应该这样做
with open('/somefile/somewhere') as f:
lines = [line.strip() for line in f]
在 CPython 中,该文件应立即关闭,因为没有对它的引用,但Python 语言不保证这一点。
在 Jython 中,在垃圾收集器运行之前不会关闭文件
它不会。上下文管理器可用于自动关闭它。例如:
with open('/somefile/somewhere') as handle:
lines = [line.strip() for line in handle]
这可以使用more_itertools
库1读取和关闭列表理解中的文件:
import more_itertools as mit
lines = [line.strip() for line in mit.with_iter(open("/somefile/somewhere"))]
注意more_itertools
是第三方包。通过安装pip install more_itertools
。
另请参阅文档以获取有关more_itertools.with_iter
.
是的,因为“打开”不会将文件句柄绑定到任何对象,一旦列表理解完成,它将在超出范围时关闭:
#!/usr/bin/env python3
import psutil
print('before anything, open files: ', end='')
print(psutil.Process().open_files())
f = open('/etc/resolv.conf')
print('after opening resolv.conf, open files: ', end='')
print(psutil.Process().open_files())
f.close()
print('after closing resolv.conf, open files: ', end='')
print(psutil.Process().open_files())
print('reading /etc/services via a list comprehension')
services = [ line.strip() for line in open('/etc/services') ]
print('number of items in services: ', end='')
print(len(services))
print('after reading /etc/services through list comp, open files: ', end='')
print(psutil.Process().open_files())