如何在python 2.4中安全地打开/关闭文件


86

我目前正在编写一个小脚本,供在使用Python的一台服务器上使用。该服务器仅安装了Python 2.4.4。

直到2.5版本问世,我才开始使用Python,所以我习惯了这种形式:

with open('file.txt', 'r') as f:
    # do stuff with f

但是,with在2.5之前没有声明,而且我很难找到有关手动清理文件对象的正确方法的示例。

使用旧版本的python时安全处置文件对象的最佳实践是什么?

Answers:


139

参见docs.python.org

处理完文件后,调用f.close()将其关闭并释放打开文件占用的所有系统资源。调用f.close()之后,尝试使用文件对象将自动失败。

因此可以close()优雅地与try/finally

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

这样可以确保即使# do stuff with f引发异常,f也仍然可以正确关闭。

需要注意的是open应该出现之外try。如果open自身引发异常,则说明该文件未打开,因此不需要关闭。另外,如果open引发异常,则不会分配其结果,f并且调用会出错f.close()


非常简单,谢谢。由于某些原因,我期望我需要更多的参与。
TM。

16
如果open失败,将在try/finally进入该块之前引发异常。因此close不会被调用。(这就是为什么您应该opentry。之前致电的原因。)
FogleBird 2010年

1
@TM我添加了有关open引发异常的注释。
乔恩·埃里克

4
这就是with语句在幕后的意思。
Arlaharen

1
在尝试中应打开文件。
安东尼·鲁特里奇

32

在上述解决方案中,在此重复:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

如果在成功打开文件之后并且在尝试之前发生了不好的事情(您永远不会知道...),则不会关闭文件,因此,更安全的解决方案是:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()

使用with with open(...)语句,无论with块如何完成(即使有异常)文件也将关闭
darkgaze

@darkgazewith open(...)绝对是现代Python中的最佳选择。
mljrg

11

如果用于以下用途,则无需根据文档关闭文件:

在处理文件对象时,最好使用with关键字。这样做的好处是,即使在执行过程中引发了异常,文件在其套件完成后也将正确关闭。它也比编写等效的try-finally块要短得多:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

此处更多内容:https : //docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


这既正确又忽略了这个问题。
乔恩·埃里克

-4

这是给出的示例,说明如何使用open和“ pythonclose

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

您必须打开文件多少次才能关闭该时间。


1
如果在之后open但之前引发了异常close,则无法使用这种方法正确关闭文件。使用withtry/finally即使在异常的情况下能够正确地关闭文件。
乔恩·埃里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.