Python-何时使用文件vs打开


138

fileopenPython 和有什么不一样?我什么时候应该使用哪个?(假设我处于2.5级)

Answers:


153

您应该始终使用open()

文档所述:

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

另外,自Python 3.0起file() 已被删除


23
令人不安的是,由于用于声明“ file()构造函数是Python 2.2中的新增功能。保留了先前的拼写形式open()出于兼容性考虑,并且它是file()的别名。” 自从我十年前决定使用RTFM并非常喜欢类型和类的统一以来,我再也没有使用过open()。而且,我仍然觉得类型构造函数是返回文件的对象的更明显的方法,该文件位于arg路径下,并按照arg模式的要求进行操作。当开发人员当时的明显意图是2保留open4compat时,我尤其会这样。
umeboshi

32

原因有两个:python哲学“应该有一种实现方法”并且file正在消失。

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

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


3
有两个原因吗?
马特

19

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)

如您所见,存在两者的充分理由和明确的用例。


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 2014年

您不只是在第二个示例中重新定义了内置名称吗?
Planetp 2014年

1
@planetp,第二个示例仅从文件类继承。我想这是奇怪的,它是在较低的情况下,但是,这是它是如何与基本内建类型(如对象,STR,列表,...)
yoniLavi

1
在Python 2.5中,file该类配备了特殊的方法,只要通过with语句打开文件,这些方法就会自动调用。这些特殊方法可确保正确安全地打开和关闭文件。
Mausy5043 '02

7

在功能上,两者是相同的;无论如何open都会调用file,因此当前的区别在于样式。在Python文档建议使用open

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

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


2
open已经是一种工厂功能,因此存在功能差异(例如,继承,isinstance()等)
Brian

4

仅使用open()打开文件。file()实际上在3.0中已被删除,目前不推荐使用。他们之间有一种奇怪的关系,但是file()现在正在进行中,因此不再需要担心。

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

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


2

Van Rossum先生说,尽管open()当前是file()的别名,但您应该使用open(),因为将来可能会改变。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.