【问题标题】:what is the difference between os.open and os.fdopen in pythonpython中的os.open和os.fdopen有什么区别
【发布时间】:2013-02-23 10:34:31
【问题描述】:

我真的很困惑何时使用os.open,何时使用os.fdopen

我所有的工作都是用os.open 完成的,它没有任何问题,但我无法理解在什么条件下我们需要file descriptors 以及dupfsync 等所有其他功能

file objectfile descriptor 不同吗

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

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

【问题讨论】:

  • 根据the docs,os.open()返回一个文件描述符,而内置的open()返回一个文件对象。

标签: python


【解决方案1】:

您将内置的open() 函数与os 模块提供的os.open() 混淆了。它们完全不同; 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 交互时非常有用。

可以通过组合os.open()(创建文件描述符)和os.fdopen()(将其包装在文件对象中)来模拟内置open

# functionally equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))

【讨论】:

  • 你说得对,我对openos.open() 感到困惑。你能给我一些代码示例吗,我可以使用fd 做一些普通open 做不到的事情。我想知道这是如何工作的
  • @user1994660 正如我在答案中所说,您不能将O_EXCL 或其他系统特定标志传递给内置open()。至于os.fdopen(),Unix API如pipe()dup()等都是返回文件描述符,而不是文件对象。在这种情况下,您将使用 os.fdopen 将此类描述符转换为文件对象。
  • 我有一个特定的问题:实际上 django 正在使用 fdopen 将上传的文件保存在 NFS 中,这需要大量时间,但是内置的 open 可以在几毫秒内完成。我想知道原因,请您指导我如何进行此任务。
  • @Amandeep 这听起来像是一个有趣的问题,是一个单独问题的材料。
猜你喜欢
  • 2011-11-05
  • 2012-10-26
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2022-01-21
  • 2018-06-06
相关资源
最近更新 更多