是否打开()。read()安全?

问题描述:

我写了很多Python代码,我只是想将一个文件读入一个变量。我知道推荐的两种方式是这些 -是否打开()。read()安全?

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

# or 

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

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

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

你的意思是“没有明确关闭文件的缺点是什么?” – 2012-03-22 21:53:37

+0

@ will,sorta。我的问题是关于特定的一段代码。你认为我应该改变标题? – FakeRainBrigand 2012-03-22 22:15:07

+5

请注意,''with''选项是优越的,因为它也能正确处理异常。 – 2012-03-22 22:56:43

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

缺点是取决于你的Python实现,打开的文件对象的清理可能会或可能不会立刻发生。这意味着文件将保持打开状态,并消耗文件句柄。这对单个文件来说可能不是问题,但是在循环中肯定会遇到麻烦。

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

+0

感谢您的解释:) – FakeRainBrigand 2012-03-22 23:49:04

缺点是后两种,第一,你可以肯定,你的文件被关闭第二块。 (在第一种情况下,即使发生异常也是如此)。

简短的表格不会给你任何这样的保证。

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

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