5

我试图谷歌但找不到答案。

如果我只是这样做

c = pickle.load(open(fileName, 'r'))

此操作后文件会自动关闭吗?

4

4 回答 4

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.
于 2013-08-01T04:22:10.897 回答
4

我讨厌分裂头发,但答案是肯定的或否定的——这取决于你问的是什么

如所写,该行会关闭文件描述符吗?是的。

此操作后会自动发生吗?是的……但可能不会立即

在此行之后会立即关闭文件吗?不,不太可能(见上面的回复)。

当文件对象的引用计数为零时,Python 将删除文件描述符。如果您在本地范围内打开文件,例如在函数内部(如您所做的那样,或者即使您已将其分配给 a 内的局部变量def),则清理该本地范围时 - 如果有没有对文件对象的剩余引用,文件将被关闭。

然而,显式地在一个块内打开文件是一个更好的选择with——这将为您关闭文件,而不是等待垃圾收集器启动。

在无意中将文件描述符分配给局部变量的情况下,您还必须小心……(请参阅:在 python 中打开的文件描述符)但您没有这样做。还可以在此处查看答案(请参阅:检查在 Python 中打开了哪些文件),以了解可以检查哪些文件描述符已打开的一些方法,无论您使用的任何操作系统都有不同的变体。

于 2015-04-14T13:18:06.287 回答
2

是的,返回值的open生命周期只有调用的生命周期pickle.load。它在关闭时关闭打开的文件描述符。

如果您极度偏执,请考虑:

with open(fileName,'r') as fin:
    c = pickle.load(fin)

with关键字建立了生命周期fin

于 2013-08-01T04:21:20.683 回答
0

不,它不会关闭文件。这是您可以使用with运算符的地方:

with open('path/to/file') as infile:
    c = pickle.load(f)

进一步阅读:这个这个

于 2013-08-01T04:21:31.903 回答