【问题标题】:How to safely open/close files in python 2.4如何在 python 2.4 中安全地打开/关闭文件
【发布时间】:2011-04-15 18:46:23
【问题描述】:

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

直到 2.5 出来我才开始使用 Python,所以我习惯了这种形式:

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

但是,在 2.5 之前没有 with 语句,我无法找到有关手动清理文件对象的正确方法的示例。

在使用旧版本的 python 时,安全处理文件对象的最佳做法是什么?

【问题讨论】:

    标签: python file-io python-2.4


    【解决方案1】:

    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() 是错误的。

    【讨论】:

    • 非常简单,谢谢。出于某种原因,我期待我需要更多的参与。
    • 如果open 失败,甚至在进入try/finally 块之前就会引发异常。所以close 不会被调用。 (这就是为什么你应该在try 之前调用open。)
    • @TM 我添加了一条关于 open 引发异常的注释。
    • 这就是 with 语句在幕后的意思。
    • 打开文件应该在 try 内进行。
    【解决方案2】:

    上面的解决方案,这里重复一下:

    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 open(...) 语句,无论 with 块如何完成(即使有异常)文件都会关闭
    • @darkgaze with open(...) 绝对是现代 Python 中的最佳选择。
    【解决方案3】:

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

    在处理文件对象时最好使用 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和“python close”的示例

    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()
    

    你打开文件必须关闭多少次是必要的。

    【讨论】:

    • 如果在open 之后close 之前引发异常,则使用此方法将无法正确关闭文件。即使存在异常,使用withtry/finally 也会正确关闭文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2013-07-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多