Python标准库【os】6 文件描述符操作1


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.openos.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值