是open()。read()安全吗?

时间:2012-03-22 21:50:06

标签: python file

我编写了很多Python代码,我只想将文件读入变量。我知道推荐的两种方法是这些 -

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

# or

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

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

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

3 个答案:

答案 0 :(得分:20)

的缺点
data = open('file').read()

根据您的Python实现,打开文件对象的清理可能会立即发生,也可能不会立即发生。这意味着文件将保持打开状态,消耗文件句柄。对于单个文件而言,这可能不是问题,但在循环中它肯定会有问题。

具体而言,CPython(通常的Python实现)使用引用计数对象,因此文件关闭几乎肯定将立即发生。但是,对于其他实现,例如IronPython或Jython,这不一定适用。

答案 1 :(得分:5)

缺点是,在第一个和第二个块之后,您可以确定您的文件已关闭。 (在第一个例子中,即使出现例外情况。)

简表并没有给你任何这样的保证。

答案 2 :(得分:2)

根据an answer中的similiar question(这次是关于写入),主要的缺点是你无法控制何时关闭该文件。这个问题对于写入更重要(因为你正在改变文件),但它仍然意味着你有一个未封闭的文件句柄,直到垃圾收集器回收该对象。

许多世代gcs将立即清除这些类型的对象(在作用域中创建,在作用域的末尾没有剩余引用),但无法保证。因此,最好坚持明确的文件关闭以确保。