【问题标题】:Reading file on top of the previous one在前一个之上读取文件
【发布时间】:2015-12-17 07:38:05
【问题描述】:

我想知道将一个文件读入另一个文件是否完全安全(在关闭缓冲区之前)。我会给出的解释是,函数 open 在使用同一个对象时会自动关闭缓冲区。

示例代码:

fr = open("asd.txt", "r")
text = fr.read()
fr.close

fr = open("asd2.txt", "r")
text = fr.read()
fr.close
...

这是一样的吗?

fr = open("asd.txt", "r")
text = fr.read()

fr = open("asd2.txt", "r")
text = fr.read()

fr.close

【问题讨论】:

    标签: python file-io io


    【解决方案1】:

    是的,第二行是一样的,因为 sn-p 都不能正确关闭文件

    您必须调用 fr.close() 方法来关闭文件对象,如果没有() 部分,则该方法仅被引用,不被执行。因此,在这两个示例中,'asd.txt' 文件对象仍处于打开状态,此时执行第二个 open() 调用。

    在 CPython(可从 Python.org 下载的默认 Python 实现)中,文件对象在不再被引用时会自动关闭,因此一旦第二个 open() 调用返回并被分配,第一个打开的文件就会作为引用关闭对象被移除。

    但是,您应该真正将文件对象用作上下文管理器,使用with statement

    with open("asd.txt", "r") as fr:
        text = fr.read()
    
    with open("asd2.txt", "r") as fr:
        text = fr.read()
    

    更有可能的是,为text 使用不同的变量名称,因为现在一个替换另一个。当块结束或该块中发生异常时,with 语句中的文件对象会自动关闭。

    【讨论】:

    • 抱歉,fr.close 是一个错字。我实际上想要 fr.close() 来写。所以无论如何建议在每次读/写之后(在打开一个新的之前)写 fr.close() ?
    • @Maxitj:最好在不再需要文件时立即关闭它。使用with 语句可确保始终发生这种情况。
    【解决方案2】:

    你可以text=open("test.txt").read(),处理数据,然后以同样的方式打开其他文件。读取数据后,它们将立即关闭。

    处理文件的更 Pythonic 方式是这样做:

    with open("test.txt") as your_file:
        text=your_file.read()
    

    注意:当你想手动关闭一个文件时,你必须像这样调用close函数:your_file.close()

    【讨论】:

    • @MartijnPieters,据我所知,有一个函数叫file,而不是File,所以这个名字可以毫无害地使用。
    • @ForceBru:使用带有大写字母的本地仍然很糟糕,特别是如果该名称也同时看起来像一个内置类型。
    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多