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

时间:2011-08-28 07:03:07

标签: python module io operating-system

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

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

7 个答案:

答案 0 :(得分:28)

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

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

来自os.open() documentation

  

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

答案 1 :(得分:7)

绝对一切:

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

  • io.open()文件名作为字符串或文件描述符作为整数,文件模式为一个字符串,和可选参数,用于描述文件编码,使用缓冲,如何处理编码错误和换行,以及文件关闭时底层FD是否关闭,并返回{{{ 1}}。

答案 2 :(得分:4)

os.openopen() from C in Unix非常相似。除非你做的事情更低级,否则你不太可能想要使用它。它为您提供了一个实际的文件描述符(如数字,而不是对象)。

io.open是您的基本Python open()以及您想要一直使用的内容。

答案 3 :(得分:0)

os.open()方法打开文件文件,并根据模式设置各种标志,并根据模式设置其模式。

默认模式为0777(八进制),并且首先屏蔽当前的unmask值。

此方法返回新打开文件的文件描述符。

虽然

io.open()方法以字符串模式中指定的模式打开文件。它返回一个新的文件句柄,或者,如果有错误,则返回nil加错误消息。

希望这有帮助

答案 4 :(得分:0)

添加到现有答案中:

  

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

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

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

  

可以通过将可调用项传递为 opener 来使用自定义的opener。的   然后通过以下方式获取文件对象的基础文件描述符:   使用( file flags )调用 opener opener 必须返回一个打开的文件   描述符(作为{em> opener 传递os.open导致的功能类似   到通过None)。

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

答案 5 :(得分:0)

数据库和系统应用程序开发人员通常使用open而不是fopen,因为前者可以更好地控制何时,将什么内容以及如何将内存内容写入其后备存储(即磁盘上的文件) )。

在类似Unix的操作系统中,open用于打开常规文件,套接字端点,设备,管道等。每个成功的open函数调用都返回一个正的文件描述符号。它提供了一致的API和框架来检查各种这些对象上的事件通知等。

但是,fopen是标准的C函数,通常用于打开常规文件并返回FILE数据结构。实际上,fopen最终会呼叫openfopen足以满足正常使用,因为开发人员无需担心何时将内存内容刷新或同步到磁盘,也不需要事件通知。

答案 6 :(得分:0)

在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'>