【问题标题】:file not being released in python文件未在python中发布
【发布时间】:2014-11-10 11:20:18
【问题描述】:

我有一个简单的代码块,可以打开一个文件,然后在运行 for 循环后关闭文件。

但是它似乎没有释放文件,因为循环下方的以下行并关闭

print os.stat('/root/message').st_size

显示为0。如果我执行ls -l,它会显示文件大小,我可以cat 输出文件并且它具有正确的内容。

这是代码块。

#!/usr/bin/python
import os
objects = { 'dave' : 'builder' , 'fred' : 'cobbler' , 'frank' : 'shoplifter' }
log = open('/root/jam' , 'w')
for bloke in objects:
        log.write("%s is a %s \n" % (bloke, objects[bloke])) 
log.close
print os.stat('/root/jam').st_size

我在这里做错了什么?

【问题讨论】:

    标签: python file file-io


    【解决方案1】:

    您忘记调用 file.close 方法;添加() 不仅可以引用该方法,还可以实际调用它:

    log.close()
    

    否则 Python 会在脚本结束后立即自动关闭文件,这就是为什么 ls -lcat 命令会显示大小和文件内容的原因。

    您也可以将文件对象用作context manager, using the with statement;只要with 块结束,文件就会为您关闭:

    import os
    
    objects = { 'dave' : 'builder' , 'fred' : 'cobbler' , 'frank' : 'shoplifter' }
    
    with open('/root/jam' , 'w') as log:
        for bloke in objects:
            log.write("%s is a %s \n" % (bloke, objects[bloke]))
    
    # with block ends, file is closed for you
    
    print os.stat('/root/jam').st_size
    

    【讨论】:

    • 当然,现在可以完美运行了。傻我。一旦允许,我会接受答案。
    【解决方案2】:

    不知道写入模式有什么问题,但可以使用 'r+' 来完成。

    import os
    objects = { 'dave' : 'builder' , 'fred' : 'cobbler' , 'frank' : 'shoplifter' }
    log = open('jam.txt', 'r+')
    for bloke in objects:
        log.write("%s is a %s \n" % (bloke, objects[bloke])) 
    log.close()
    print os.stat('jam.txt').st_size
    

    其他模式可见http://www.tutorialspoint.com/python/python_files_io.htm

    【讨论】:

    • 如果 OP 实际上没有关闭文件,则使用 r+ 进行读取和写入不会有什么不同。数据将同样停留在文件缓冲区中。此外,'r+' 如果文件不存在,则不会创建该文件。
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2017-08-31
    • 2020-10-10
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多