os模块提供了各种操作系统接口。包括环境变量、进程管理、进程调度、文件操作等方面。
这里整理了操作文件描述符的部分方法。
参考:os模块官方文档
os模块的方法和系统相关,且一些方法依赖python版本,测试时使用下面的在线工具:
在线python-3.12版本-Unix平台
9 文件描述符操作
9.1 文件描述符
文件描述符是一些小整数,对应当前进程所打开的文件。
进程标准输入的文件描述符通常是0,标准输出是1,标准错误是2。进程后续打开的文件的文件描述符会依次指定为3、4、5等。
可以使用f.fileno()
获取文件对象对应的文件描述符。
>>> f = open("test", "w")
>>> f.fileno()
5
9.2 打开文件描述符
-
os.open(path, flags, mode=0o777, *, dir_fd=None)
打开path指定的文件,根据flags设置标志位,并根据mode设置权限。
计算mode时会先按当前umask值将部分权限去掉。
dir_fd允许path使用相对路径。
flags常量在os
模块中有定义,这些常量的用法说明参考:Unix系统 open(2)手册 、Windows系统 _open和_wopen方法>>> with open("test.txt", "w") as f: ... f.write("1\n22\n333\n") ... 9 >>> fd = os.open("test.txt", os.O_RDONLY) >>> fd 5
-
os.fdopen(fd, *args, **kwargs)
返回打开文件描述符fd对应文件的对象。>>> os.fdopen(fd) <_io.TextIOWrapper name=5 mode='r' encoding='cp936'>
-
os.pipe()
创建一个管道,返回一对分别用于读写的文件描述符(r, w)
。
新的文件描述符不可继承。仅Unix可用。>>> os.pipe() (4, 5)
-
os.pipe2(flags)
创建带有flags标志位的管道,返回一对分别用于读写的文件描述符(r, w)
。
仅Unix可用。 -
os.posix_openpt(oflag)
打开并返回一个代表主要伪终端设备的文件描述符。
oflag可以设置文件状态旗标和文件访问模式。
9.3 关闭文件描述符
os.close(fd)
关闭文件描述符fd。
关闭由os.open()
或os.pipe()
返回的文件描述符。
内置函数open()
、popen()
或fdopen()
返回的文件对象应该用其自身的close()
方法关闭。os.closerange(fd_low, fd_high)
关闭一系列文件描述符,并忽略错误。
包括fd_low,但是不包括fd_high。
9.4 读取数据
-
os.posix_fadvise(fd, offset, advice)
声明以特定模式访问数据,以便内核提前进行优化。
数据范围是fd指向的文件的offset开始,持续len字节。
advice指定访问模式,可取值如下:os.POSIX_FADV_NORMAL
,不指定访问方式;os.POSIX_FADV_SEQUENTIAL
, 需要访问指定的数据顺序;os.POSIX_FADV_RANDOM
,数据以随机顺序访问;os.POSIX_FADV_NOREUSE
,数据只访问一次;os.POSIX_FADV_WILLNEED
,数据在不久的将来访问;os.POSIX_FADV_DONTNEED
,数据不会在短期内访问;
-
os.read(fd, n)
从文件描述符至多读取n个字节。
适用于低级I/O操作,只能用于os.open
或os.pipe
返回的文件描述符。>>> fd = os.open("test.txt", os.O_RDONLY) >>> os.read(fd, 3) b'1\r\n'
-
os.pread(fd, n, offset)
从指定的文件的偏移位置offset开始读取n个字节。
文件的指针不会移动。返回读取的字节数据。
如果读取到文件末尾,则会返回空字节对象。>>> fd = os.open("test.txt", os.O_RDONLY) >>> os.pread(fd, 3, 3) b'2\n3'
9.5 写数据
os.write(fd, str)
把字节串写到文件描述符。>>> os.pipe() (4, 5) >>> os.write(5, b"1234567890") 10 >>> os.read(4, 5) b'12345' >>> os.read(4, 5) b'67890' >>> os.read(4, 5) b''
os.pwrite(fd, str, offset)
把字节串写入文件的偏移位置处。
文件指针不变,返回写入的字节数。
9.6 读写缓冲区数据
-
os.readv(fd, buffers)
从文件描述符读取数据到多个字节类对象缓冲区中。
返回实际读取的字节总数。 -
os.preadv(fd, buffers, offset, flags=0)
从指定文件的便宜位置offset开始,把数据读取到可变字节类对象buffers中。
文件的指针位置保持不变。
数据会依次存到每个缓冲区中。操作系统对允许使用的缓冲区数目有限制(限制数为os.sysconf()
结果中的SC_IOV_MAX
值)。
flags可选值:os.RWF_NOWAIT
,不等待无法立即获得的数据,未读取到返回-1;os.RWF_HIPRI
高优先级读写,允许基于块的文件系统对设备做轮询。
该方法是os.pread()
和os.readv()
的结合。 -
os.writev(fd, buffers)
把缓冲区buffers的内容写到文件描述符fd。 -
os.pwritev(fd, buffers, offset, flags=0)
把buffers内容写入文件的偏移位置处。
buffers是字节型对象组成的序列。
flags可由一个或多个标志位按位或运算得到:os.RWF_SYNC
,提供预写功能,和带os.O_SYNC
标志的os.open()
等效;os.RWF_DSYNC
,提供预写功能,和带os.O_DSYNC
标志的os.open()
等效;os.RWF_APPEND
,提供预写功能,和带os.O_APPEND
标志的os.open()
等效。
9.7 磁盘操作
-
os.posix_fallocate(fd, offset, len)
确保为fd指向的文件分配了足够的磁盘空间,该空间从offset开始的len字节。 -
os.fsync(fd)
强制把文件描述符fd指定的文件写入磁盘。
对于缓冲区文件对象f,需要先执行f.flush()
,然后执行os.fsync(f.fileno())
,确保把所有内部缓冲区写入磁盘。 -
os.fdatasync(fd)
强制把fd指定的文件写入磁盘,不强制更新元数据。 -
os.ftruncate(fd, length)
截断文件描述符fd指定的文件,保留length个字节。>>> fd = os.open('test.txt', os.O_RDWR) >>> os.ftruncate(fd, 2) >>> os.close(fd) >>> fd = os.open('test.txt', os.O_RDONLY) >>> os.read(fd, 3) b'1\r' >>> os.read(fd, 3) b''
以上是os模块关于文件和目录操作的一部分函数的整理。
该模块的其他内容参考:
os模块:环境变量、进程所属的用户和组
os模块:进程管理
os模块:调度策略、系统信息
os模块:文件和目录1
os模块:文件和目录2
os模块:文件描述符操作2