Python中io.open()和os.open()有什么区别?

45 投票
7 回答
25497 浏览
提问于 2025-04-17 00:28

我发现我一直在用的 open() 函数其实是 io.open() 的一个别名,而从 os 模块导入 * 会把这个别名给覆盖掉。

那么,通过 io 模块和 os 模块打开文件有什么区别呢?

7 个回答

5

补充一下已有的回答:

我意识到我一直在使用的 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() 的文档,其中展示了如何相对于给定目录打开文件。

7

关于文件操作的基本知识:

  • os.open() 这个函数需要你提供一个 文件名(用字符串表示),一个 文件模式(用位掩码表示一些属性),还有一个 可选参数,这个参数用来描述文件的权限设置。这个函数会返回一个文件描述符,类型是整数。

  • io.open() 这个函数可以接受一个 文件名(用字符串表示)或者一个 文件描述符(用整数表示),还需要一个 文件模式(用字符串表示),以及一些 可选参数,这些参数用来描述文件的编码方式、缓冲设置、如何处理编码错误和换行符,以及在文件关闭时底层的文件描述符是否也会关闭。这个函数会返回一个 io.IOBase 的子类对象。

34

io.open() 是处理文件输入输出的更高级别的方法。它把操作系统层面的文件描述符封装成一个对象,这样你就可以用更符合Python风格的方式来访问文件。

os.open() 则是一个更底层的接口,它是对POSIX系统调用的封装。它需要的参数比较简单(更符合POSIX的风格),返回的是一个文件描述符(一个数字),用来表示打开的文件。它并不会返回一个文件对象;所以返回的值没有 read()write() 这些方法。

根据 os.open() 的文档

这个函数是为了低级别的输入输出设计的。对于一般的使用,建议使用内置的 open() 函数,它会返回一个“文件对象”,这个对象有 read()write() 方法(还有很多其他功能)。

撰写回答