我意识到我一直在使用的open()函数是io.open()的别名,并且从os导入*会使它黯然失色。
通过io模块和os模块打开文件有什么区别?
-
来自Python文档:此函数[os.open]用于低级I / O。 为了正常使用,请使用内置函数open(),该函数返回具有read()和wprite()方法(以及更多方法)的文件对象。 要将文件描述符包装在文件对象中,请使用fdopen()。
-
切勿import *。
-
这个问题应该标记为python3。 在python2中,open()和io.open()是不同的。
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).
-
尽管我不得不怀疑,为什么有人会选择Python作为底层I / O?
-
也许Python是最适合程序员的语言。也许他们正在为另一个Python程序编写插件。
-
为什么不?低级操作并没有决定我们应该用哪种语言表达。
-
@IoannisFilippidis因为如果要使用低级接口,那么为什么还要使用Python开头呢?除非使用高级接口无法完成您的工作,或者高级接口存在严重的性能问题,否则应使用所使用的语言来使用高级接口-否则,您应该完全使用另一种语言。
-
与使用C语言编写相比,Python更具可读性和灵活性,并且可以通过访问使用Python编写的科学程序包而受益于某些计算。
-
@IoannisFilippidis那是我的观点。如果您想要Python的灵活性,那么您可能还是想使用它的高级I / O接口-否则会导致移植性,可读性和可维护性降低。
-
我的观点是,您确实想用Python编写低级代码,以及更适合Python的高级代码。
-
无论如何,我可能都用Cython编写,所以用C编写,因为flat比嵌套更好(PEP 20),而Ive过去也这样做,所以这里的重点更多是为了讨论。
-
有关为什么可能要使用os.open的示例,请参见:stackoverflow.com/a/45368120/2705757(在创建时设置文件许可权,而不使用os.chmod)
绝对一切:
os.open与Unix中C语言的open()非常相似。除非您要进行更底层的操作,否则您不太可能想要使用它。它为您提供了一个实际的文件描述符(如数字,而不是对象)。
io.open是您的基本Python open(),几乎是您想一直使用的。
-
这是否意味着如果我使用一些简单的C文件IO代码,将os.放在stdio函数之前,并将扩展名更改为.py,该代码将无错误地执行?
-
我对此表示高度怀疑,但很想知道它的进展(只是不要破坏任何东西)。
要添加到现有答案中:
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最终会调用open。 fopen对于常规用法已经足够了,因为开发人员无需担心何时将内存内容刷新或同步到磁盘,也不需要事件通知。
os.open()方法将打开文件文件,并根据标志设置各种标志,并可能根据模式设置其模式。
默认模式为0777(八进制),当前的非掩码值首先被掩码。
此方法返回新打开文件的文件描述符。
而,
io.open()方法以字符串模式中指定的模式打开文件。它返回一个新的文件句柄,或者在出现错误的情况下返回nil以及错误消息。
希望这可以帮助