我很困惑何时使用os.open和何时使用os.fdopen
我正在做我所有的工作,os.open它没有任何问题,但我无法理解我们需要什么条件file descriptors和所有其他功能,如dup和fsync
是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)