我真的很困惑何时使用os.open
以及何时使用os.fdopen
我正在使用os.open
完成所有工作,但它没有任何问题,但我无法理解我们需要file descriptors
以及dup
和{等所有其他功能的条件{1}}
fsync
是否与file object
我的意思是file descriptor
现在是文件对象还是文件描述符?
答案 0 :(得分:54)
您将内置open()
功能与os.open()
模块提供的os
混淆。他们是完全不同的; os.open(filename, "w")
无效Python(os.open
接受整数标志作为其第二个参数),open(filename, "w")
是。
简而言之,open()
创建新文件对象,os.open()
创建操作系统级文件描述符,os.fdopen()
从文件描述符中创建文件对象。
文件描述符是用于处理由操作系统内核直接提供的文件的低级工具。文件描述符是一个小整数,用于标识内核为每个进程保留的打开文件表中的打开文件。许多系统调用都接受文件描述符,但它们不方便使用,通常需要固定宽度的缓冲区,在某些条件下需要多次重试,以及手动错误处理。
文件对象是包含文件描述符的Python类,使文件处理更方便,更不容易出错。例如,它们提供错误处理,缓冲,逐行读取,字符集转换,并在收集垃圾时关闭。
概括说明:
内置open()
获取文件名并返回一个新的Python文件对象。这是大多数情况下你需要的。
os.open()
获取文件名并返回新的文件描述符。此文件描述符可以传递给其他低级函数,例如os.read()
和os.write()
,或传递给os.fdopen()
,如下所述。编写依赖于依赖于操作系统的API的代码时,您只需要这样做,例如使用O_EXCL
标记open(2)
。
os.fdopen()
采用现有的文件描述符 - 通常由Unix系统调用(如pipe()
或dup()
生成),并围绕它构建Python文件对象。实际上,它将文件描述符转换为完整文件对象,这在与C代码或仅创建低级文件描述符的API接口时非常有用。
内置open
可以使用os.open()
(创建文件描述符)和os.fdopen()
(将其包装在文件对象中)实现:
# equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))