我试过谷歌但找不到答案。
如果我这样做
c = pickle.load(open(fileName, 'r'))
此操作后文件会自动关闭吗?
答案 0 :(得分:9)
不,但你可以简单地调整它以关闭文件:
# 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.
答案 1 :(得分:3)
我讨厌分裂,但答案是 是或否 - 取决于完全你在问什么。
写入的行是否会关闭文件描述符? 是的
此操作后会自动发生吗? 是... 但可能不是立即。
此行后会立即关闭文件吗? 不,不太可能(见上面的回复)。
当文件对象的引用计数为零时,Python将删除文件描述符。如果要在本地作用域中打开文件,例如在函数内部(或者已经完成,或者即使已将其分配给def
内的局部变量),也要清除本地作用域 - 如果没有对文件对象的剩余引用,则文件将被关闭。
然而,显式是一个更好的选择,并在with
块中打开文件 - 这将为您关闭文件,而不是等待垃圾收集器启动。
在无意中将文件描述符分配给局部变量的情况下,您还必须小心......(请参阅:opened file descriptors in python)但您没有这样做。另请查看这里的答案(请参阅:check what files are open in Python),了解一些可以检查哪些文件描述符是打开的方法,以及适用于您所使用的操作系统的不同变体。
答案 2 :(得分:2)
是的,open
的返回值的生命周期仅为pickle.load
调用的生命周期。它在关闭时关闭打开的文件描述符。
如果你非常偏执,请考虑:
with open(fileName,'r') as fin:
c = pickle.load(fin)
with
关键字确定fin
答案 3 :(得分:0)