Python中io.open()和os.open()有什么区别?
我发现我一直在用的 open()
函数其实是 io.open()
的一个别名,而从 os
模块导入 *
会把这个别名给覆盖掉。
那么,通过 io
模块和 os
模块打开文件有什么区别呢?
7 个回答
补充一下已有的回答:
我意识到我一直在使用的
open()
函数其实是io.open()
的别名。
在 Python 3 中,open()
和 io.open()
是一样的。但在 Python 2 中,它们是不同的。
使用 open()
函数,我们可以很方便地获取一个文件对象,这个对象有好用的 read()
和 write()
方法。不过,在操作系统层面,文件是通过文件描述符(在 Windows 中叫文件句柄)来访问的。因此,os.open()
实际上是在后台被隐式使用的。我没有仔细查看 Python 的源代码,但在 Python 3.3 中为 open()
添加的 opener
参数的文档中提到:
可以通过传递一个可调用对象作为 opener 来使用自定义的打开器。然后,文件对象的底层文件描述符是通过调用 opener 并传入 (file, flags) 来获得的。opener 必须返回一个打开的文件描述符(将
os.open
作为 opener 传入的效果和传入None
是一样的)。
所以,os.open()
是 open()
的默认打开器,如果需要更改文件的标志或模式,我们也可以指定一个自定义的包装器。有关自定义打开器的示例,可以查看 open() 的文档,其中展示了如何相对于给定目录打开文件。
io.open()
是处理文件输入输出的更高级别的方法。它把操作系统层面的文件描述符封装成一个对象,这样你就可以用更符合Python风格的方式来访问文件。
os.open()
则是一个更底层的接口,它是对POSIX系统调用的封装。它需要的参数比较简单(更符合POSIX的风格),返回的是一个文件描述符(一个数字),用来表示打开的文件。它并不会返回一个文件对象;所以返回的值没有 read()
或 write()
这些方法。
根据 os.open()
的文档:
这个函数是为了低级别的输入输出设计的。对于一般的使用,建议使用内置的
open()
函数,它会返回一个“文件对象”,这个对象有read()
和write()
方法(还有很多其他功能)。