我试图谷歌但找不到答案。
如果我只是这样做
c = pickle.load(open(fileName, 'r'))
此操作后文件会自动关闭吗?
不,但您可以简单地调整它以关闭文件:
# file not yet opened
with open(fileName, 'r') as f:
# file opened
c = pickle.load(f)
# file opened
# file closed
语句的作用是with
(除其他外)调用语句中__exit__()
列出的对象的方法with
(在这种情况下:打开的文件),在这种情况下关闭文件。
关于打开文件的__exit__()
方法:
>>> f = open('deleteme.txt', 'w')
>>> help(f.__exit__)
Help on built-in function __exit__:
__exit__(...)
__exit__(*excinfo) -> None. Closes the file.
我讨厌分裂头发,但答案是肯定的或否定的——这取决于你问的是什么。
如所写,该行会关闭文件描述符吗?是的。
此操作后会自动发生吗?是的……但可能不会立即。
在此行之后会立即关闭文件吗?不,不太可能(见上面的回复)。
当文件对象的引用计数为零时,Python 将删除文件描述符。如果您在本地范围内打开文件,例如在函数内部(如您所做的那样,或者即使您已将其分配给 a 内的局部变量def
),则清理该本地范围时 - 如果有没有对文件对象的剩余引用,文件将被关闭。
然而,显式地在一个块内打开文件是一个更好的选择with
——这将为您关闭文件,而不是等待垃圾收集器启动。
在无意中将文件描述符分配给局部变量的情况下,您还必须小心……(请参阅:在 python 中打开的文件描述符)但您没有这样做。还可以在此处查看答案(请参阅:检查在 Python 中打开了哪些文件),以了解可以检查哪些文件描述符已打开的一些方法,无论您使用的任何操作系统都有不同的变体。
是的,返回值的open
生命周期只有调用的生命周期pickle.load
。它在关闭时关闭打开的文件描述符。
如果您极度偏执,请考虑:
with open(fileName,'r') as fin:
c = pickle.load(fin)
with
关键字建立了生命周期fin