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

Gio*_*rje 34 python io operating-system module

我意识到open()我一直在使用的函数是一个别名,io.open()并且*从中导入os会掩盖这一点.

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

cdh*_*wie 28

io.open()是文件I/O的首选,更高级别的接口.它将OS级文件描述符包装在一个对象中,您可以使用该对象以Pythonic方式访问该文件.

os.open()只是较低级别POSIX系统调用的包装器.它需要较少的符号(和更多POSIX-y)参数,并返回表示打开文件的文件描述符(数字).它并没有返回一个文件对象; 返回的值不会有read()write()方法.

os.open()文档:

此功能适用于低级I/O. 对于正常使用,使用内置函数open(),该函数返回带有read()write()方法(以及更多)的"文件对象" .

  • 虽然我不得不怀疑,为什么有人会选择Python作为低级I/O? (3认同)
  • 也许 Python 是编码人员最熟悉的语言。或者他们正在为另一个 Python 程序编写插件。 (2认同)
  • 为什么不?低级操作并不决定我们应该用什么语言表达. (2认同)
  • 我的观点是,你*想*在Python中编写低级代码,在其他*高级代码中,Python更适合这些代码. (2认同)

Ign*_*ams 7

绝对一切:

  • os.open()文件名作为字符串,文件模式作为属性的按位掩码,以及描述文件权限位的可选参数,并将文件描述符作为整数返回.

  • io.open()文件名作为字符串或文件描述符作为整数,文件模式作为字符串,以及描述文件编码,使用缓冲,如何处理编码错误和换行符以及底层FD何时关闭的可选参数文件已关闭,并返回一些后代io.IOBase.


wom*_*ire 5

添加到现有答案:

我意识到我一直在使用的 open() 函数是 io.open() 的别名

open()==io.open()仅适用于 Python 3。在 Python 2 中它们是不同的。

在Python中,我们可以通过方便的方法open()获得易于使用的文件对象,而在操作系统级别上,文件是使用文件描述符(或Windows中的文件句柄)来访问的。因此,应该在幕后隐式使用。我还没有检查过这方面的Python源代码,但是Python 3.3中添加的参数的文档说:read()write()os.open()openeropen()

可以通过将可调用对象作为opener传递来使用自定义 opener 。然后通过使用 ( file , flags ) 调用opener来获取文件对象的底层文件描述符。opener必须返回一个打开的文件描述符(作为opener传递会产生与传递类似的功能)。os.openNone

os.open()的默认开启器也是如此,open()如果需要更改文件标志或模式,我们还可以在它周围指定一个自定义包装器。有关自定义打开程序的示例,请参阅文档open(),该打开程序打开相对于给定目录的文件。


小智 5

在Python 2中,内置的open和io.open是不同的(io.open更新并且支持更多的东西)。在 Python 3 中,open 和 io.open 现在是同一件事(它们摆脱了旧的内置 open),因此您应该始终使用 open。需要与 Python 2 和 3 兼容的代码可能有理由使用 io.open。

下面的代码来验证这一点。

import io
with io.open("../input/files.txt") as f:
    text = f.read().lower()

with open('../input/files.txt', encoding='utf-8') as f2:
    text2 = f2.read().lower()

print(type(f))
print(type(f2))
# <class '_io.TextIOWrapper'>
# <class '_io.TextIOWrapper'>
Run Code Online (Sandbox Code Playgroud)