我意识到我一直使用的open()
函数是io.open()
的别名,而从*
导入os
会掩盖这一点。
通过io
模块和os
模块打开文件有什么区别?
答案 0 :(得分:28)
io.open()
是文件I / O的首选更高级别接口。它将OS级文件描述符包装在一个对象中,您可以使用该对象以Pythonic方式访问该文件。
os.open()
只是较低级别POSIX系统调用的包装器。它需要较少的符号(和更多POSIX-y)参数,并返回表示打开文件的文件描述符(数字)。它不返回文件对象;返回的值不会有read()
或write()
方法。
此功能适用于低级I / O.对于正常使用,请使用内置函数
open()
,该函数返回带有read()
和write()
方法(以及更多)的“文件对象”。
答案 1 :(得分:7)
绝对一切:
答案 2 :(得分:4)
os.open
与open()
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
最终会呼叫open
。 fopen
足以满足正常使用,因为开发人员无需担心何时将内存内容刷新或同步到磁盘,也不需要事件通知。
答案 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'>