Python - 何时使用file与open?

141
在Python中,fileopen有什么区别?我应该在什么情况下使用哪个?(假设我使用的是2.5版本)
6个回答

157

您应该始终使用open()

文档所述:

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

此外,自Python 3.0以来已删除file()


23
这非常令人烦恼,因为文档曾经说明“file()构造函数在Python 2.2中是新的。为了兼容性保留了以前的拼写方式open(),并作为file()的别名。” 十年前,由于我决定阅读官方文档并非常喜欢类型和类的统一,我再也没有使用过open()。此外,我仍然认为类型构造函数是返回类似文件对象的更明显的方法,它由路径参数确定,并按照模式参数中请求的方式运行。特别是当开发人员的明显意图是保留 open 以便兼容时,我尤其有这种感觉。 - umeboshi

33

这样做有两个原因:Python 哲学中的 "应该有一种方法来做" 和 file 即将消失。

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

在 Python 3.0 中,file 将从内置变成由 io 库中的多个类实现(类似于 Java 的缓冲读取器等)。


3
两个原因是什么? - Matt

19

file()是一种类型,就像int或list一样。 open()是用于打开文件的函数,并且会返回一个file对象。

这是您应该使用open的示例:

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

这是一个使用file时应该的例子:

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

正如您所看到的,两者都有充分的存在理由,并且都有明确的使用情境。


5
通常应使用 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 - IceArdor
在第二个例子中,你不是重新定义了内置名称吗? - planetp
1
@planetp,第二个例子只是继承了文件类。我想它的小写形式可能有点奇怪,但这就是基本内置类型(例如object、str、list等)的写法。 - yoniLavi
1
在Python 2.5中,file类配备了特殊方法,每当通过with语句打开文件时自动调用。这些特殊方法确保文件被正确和安全地打开和关闭。 - Mausy5043

7

就功能而言,两者是相同的;open 无论如何都会调用 file,因此目前的区别只是风格问题。Python文档 建议使用 open

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

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


2
open已经是一个工厂函数,因此存在功能上的差异(例如继承、isinstance()等)。 - Brian

4

只使用open()来打开文件。file()在3.0版本中被移除了,在当前版本中已经被弃用。它们之间有一种奇怪的关系,但是现在file()即将消失,所以不需要再担心了。

以下内容摘自Python 2.6文档。[方括号]是我添加的。

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


2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接