open().read() 是安全的吗?

21

我经常编写Python代码,只是想将文件读入变量中。我知道有两种推荐的方法:

with open('file') as f:
    data = f.read()

# or

fo = open('file')
data = f.read()
fo.close()

我的问题是,这样做有什么缺点?

data = open('file').read()

1
你的意思是“不明确关闭文件的缺点是什么?” - William Pursell
@Will,有点像。我的问题是关于具体的代码片段。你认为我应该改变标题吗? - Brigand
5
请注意,“with”选项更优秀,因为它可以正确处理异常。 - Gareth Latty
3个回答

24

这种方法的缺点是

data = open('file').read()

取决于你的Python实现方式,打开文件对象的清理可能会立即发生,也可能不会。这意味着文件将保持打开状态,占用文件句柄。对于单个文件,这可能不是问题,但在循环中可能会出现问题。

具体而言,CPython(通常的Python实现方式)使用引用计数对象,因此文件关闭几乎肯定会立即发生。然而,对于其他实现方式(如IronPython或Jython),这并非一定如此。


CPython是该语言的参考实现,因此也是规范的一部分。这是否意味着其他实现也必须遵循该行为? - zr67800

6

缺点是,在第一个和第二个块之后,您可以确保文件已关闭。(即使在第一种情况下出现异常。)

简短的形式没有提供这样的保证。


2
根据类似问题中的一个回答(这次是关于写入的),主要缺点是您无法控制文件何时关闭。对于写入(因为您正在更改文件),问题更为严重,但仍然意味着在垃圾收集器回收对象之前,您有一个未关闭的文件句柄。
许多分代垃圾收集器将立即清除这些类型的对象(在作用域中创建,并在作用域结束时没有剩余引用),但不能保证。因此,最好坚持明确地关闭文件以确保安全。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接