在python中os.open和os.fdopen有什么区别

use*_*660 35 python

我很困惑何时使用os.open和何时使用os.fdopen

我正在做我所有的工作,os.open它没有任何问题,但我无法理解我们需要什么条件file descriptors和所有其他功能,如dupfsync

file object不同的file descriptor

我的意思是 f = os.open("file.txt",w)

现在是文件对象还是文件描述符?

use*_*342 61

您正在混淆模块提供的内置open()函数.他们是完全不同的; 是无效的Python(接受整数标志作为其第二个参数),是.os.open()osos.open(filename, "w")os.openopen(filename, "w")

简而言之,open()创建新的文件对象,os.open()创建OS级文件描述符,并os.fdopen()从文件描述符中创建文件对象.

文件描述符是用于处理由操作系统内核直接提供的文件的低级工具.文件描述符是一个小整数,用于标识内核为每个进程保留的打开文件表中的打开文件.许多系统调用接受文件描述符,但它们不方便使用,通常需要固定宽度缓冲区,在某些条件下多次重试,以及手动错误处理.

文件对象是包含文件描述符的Python类,使文件处理更方便,更不容易出错.例如,它们提供错误处理,缓冲,逐行读取,字符集转换,并在收集垃圾时关闭.

概括:

  • 内置open()文件名并返回一个新的Python文件对象.这是大多数情况下您需要的.

  • os.open()获取文件名并返回新的文件描述符.该文件描述符可以传递给其他低级函数,例如os.read()os.write(),或者os.fdopen()如下所述.编写依赖于依赖于操作系统的API的代码时,您只需要这样做,例如使用O_EXCL标志open(2).

  • os.fdopen()获取现有的文件描述符 - 通常由Unix系统调用(如pipe()or dup())生成,并在其周围构建Python文件对象.实际上,它将文件描述符转换为完整文件对象,这在与C代码或仅创建低级文件描述符的API进行交互时非常有用.

内置open可以使用os.open()(创建文件描述符)和os.fdopen()(将其包装在文件对象中)来实现:

# equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))
Run Code Online (Sandbox Code Playgroud)

  • @user1994660 正如我在答案中所说,您不能将“O_EXCL”或其他系统特定的标志传递给内置“open()”。至于 os.fdopen() , Unix API 如 pipeline() 、 dup() 等都返回文件描述符,而不是文件对象。在这种情况下,您可以使用 os.fdopen 将此类描述符转换为文件对象。 (2认同)