【问题标题】:Python - When to use file vs openPython - 何时使用文件与打开
【发布时间】:2008-09-22 03:04:14
【问题描述】:

fileopen 在 Python 中的区别是什么?我什么时候应该使用哪一个? (假设我在 2.5)

【问题讨论】:

    标签: python file


    【解决方案1】:

    您应该始终使用open()

    正如documentation 所说:

    打开文件时,最好 使用 open() 而不是调用它 直接构造函数。文件更多 适合类型测试(例如, 写“isinstance(f, file)”)。

    另外,file() has been removed 从 Python 3.0 开始。

    【讨论】:

    • 这很令人痛心,因为文档曾经声明“file() 构造函数是 Python 2.2 中的新构造。之前的拼写 open() 是为了兼容性而保留的,它是 file( )。”自从十年前决定做 RTFM 之后,就非常喜欢类型和类的统一,所以我再也没有使用 open()。此外,我仍然觉得类型构造函数是返回文件之类的对象的更明显方式,该对象位于路径 arg 中,并按照模式 arg 的要求运行。当当时开发人员的明显意图是 2 保留 open4compat 时,我尤其有这种感觉。
    【解决方案2】:

    两个原因:“应该有一种方法来做到这一点”和 file 的 Python 哲学正在消失。

    file 是实际类型(使用例如file('myfile.txt') 正在调用其构造函数)。 open 是一个工厂函数,它会返回一个文件对象。

    在 python 3.0 中,file 将从内置转变为由 io 库中的多个类实现(有点类似于带有缓冲读取器的 Java 等)

    【讨论】:

    • 两个原因是什么?
    【解决方案3】:

    file() 是一种类型,如 int 或列表。 open()是一个打开文件的函数,会返回一个file对象。

    这是一个应该使用 open 的示例:

    f = open(filename, 'r')
    for line in f:
        process(line)
    f.close()
    

    这是你应该使用文件的例子:

    class LoggingFile(file):
        def write(self, data):
            sys.stderr.write("Wrote %d bytes\n" % len(data))
            super(LoggingFile, self).write(data)
    

    如您所见,两者都存在是有充分理由的,并且两者都有明确的用例。

    【讨论】:

    • 一般情况下,文件应该用with语句打开。 with open(filename, 'r') as f: \ for line in f: \ process(line)。这避免了显式关闭。 Python 2.6 及更高版本原生支持with 语句。在 Python 2.5 中,您必须将 from __future__ import with_statement 添加到代码的顶部。
    • 第二个例子中的内置名称不是重新定义了吗?
    • @planetp,第二个例子只是继承自文件类。我想它是小写的很奇怪,但这就是基本的内置类型(例如 object、str、list ......)的方式
    • 在 Python 2.5 中,file 类配备了特殊方法,只要通过 with 语句打开文件,就会自动调用这些方法。这些特殊方法可确保文件正确安全地打开和关闭。
    【解决方案4】:

    从功能上来说,两者是一样的; open 无论如何都会调用file,所以目前的区别是风格问题。 Python docs 推荐使用open

    打开文件时,最好使用 open() 而不是直接调用文件构造函数。

    原因是在未来的版本中不能保证它们是相同的(open 将成为一个工厂函数,它根据打开的路径返回不同类型的对象)。

    【讨论】:

    • open 已经是工厂函数,所以存在功能上的差异(例如继承、isinstance() 等)
    【解决方案5】:

    只使用 open() 打开文件。 file() 实际上在 3.0 中已被删除,目前已弃用。他们有一种奇怪的关系,但是file()现在已经走了,所以不用担心了。

    以下内容来自 Python 2.6 文档。 [括号的东西]由我添加。

    当打开一个文件时,最好使用 open() 而不是直接调用这个 [file()] 构造函数。 file 更适合类型测试(例如写 isinstance(f, file)

    【讨论】:

      【解决方案6】:

      根据 Van Rossum 先生的说法,虽然 open() 目前是 file() 的别名,但您应该使用 open(),因为这在未来可能会改变。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        • 2019-09-07
        • 1970-01-01
        • 2014-06-27
        • 2016-08-31
        相关资源
        最近更新 更多