关于模块:Python上的io.open()和os.open()有什么区别?

What's the difference between io.open() and os.open() on Python?

我意识到我一直在使用的open()函数是io.open()的别名,并且从os导入*会使它黯然失色。

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


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

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

os.open()文档中:

This function is intended for low-level I/O. For normal usage, use the built-in function open(), which returns a"file object" with read() and write() methods (and many more).


绝对一切:

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

  • io.open()将文件名作为字符串,将文件描述符作为整数,将文件模式作为字符串,并使用可选参数来描述文件编码,使用的缓冲,编码错误和换行符的处理方式以及基础FD是否为关闭文件时关闭,并返回io.IOBase的某些后代。


os.open与Unix中C语言的open()非常相似。除非您要进行更底层的操作,否则您不太可能想要使用它。它为您提供了一个实际的文件描述符(如数字,而不是对象)。

io.open是您的基本Python open(),几乎是您想一直使用的。


要添加到现有答案中:

I realised that the open() function I've been using was an alias to io.open()

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

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

A custom opener can be used by passing a callable as opener. The
underlying file descriptor for the file object is then obtained by
calling opener with (file, flags). opener must return an open file
descriptor (passing os.open as opener results in functionality similar
to passing None).

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


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

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

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


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

默认模式为0777(八进制),当前的非掩码值首先被掩码。

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

而,

io.open()方法以字符串模式中指定的模式打开文件。它返回一个新的文件句柄,或者在出现错误的情况下返回nil以及错误消息。

希望这可以帮助