引言
os函数的功能如下图所示,在前面的博客中,小编带各位小可爱一起了解了os库的文件和目录操作功能相关的函数和操作当前进程和用户信息的函数(python——os库(操作当前进程和用户信息)-CSDN博客、python——os库(文件和目录操作)-CSDN博客、python——os库之os.remove函数-CSDN博客和python—os库之os.path系列-CSDN博客),本篇博客小编将带大家一起学习os库中文件IO操作相关的函数。
文件IO操作包括哪些函数?
文件IO操作具体的函数功能、函数、作用及参数如下表所示:
功能 | 函数 | 作用 | 参数 | |
文件IO操作 | os.close(fd) | 关闭一个文件描述符。 | ||
os.closerange(fd_low, fd_high) | 用于关闭一个范围内的所有文件描述符。对于操作系统资源有限或者需要打开大量文件的情况,可以有效地关闭一系列文件描述符,而不需要逐一关闭。 | 参数 "fd_low" 和 "fd_high" 都是整数,表示需要关闭的文件描述符的范围。 | ||
os.device_encoding(fd) | 这个函数用于查询给定文件描述符对应的设备的编码。这在处理需要特定编码的设备如终端或特定类型的文件时非常有用。 | 参数 "fd" 是一个整数,表示需要获取设备编码的文件描述符。 | ||
os.dup(fd) | 复制文件描述符的函数。这在需要在不同的上下文中使用同一个文件,但需要保持原文件描述符不变的情况下非常有用。 | 参数 "fd" 是一个整数,表示需要复制的文件描述符 | ||
os.dup2(fd, fd2, inheritable=True) | 将一个文件描述符 fd 复制到另一个 fd2,如果 fd2 已经存在,将会先关闭。在需要重定向输入/输出流,或者复用文件描述符的场景中非常有用。 | 参数 "fd" 是一个整数,表示需要复制的源文件描述符。"fd2" 也是一个整数,表示目标文件描述符。如果 "fd2" 已经存在,则 "os.dup2(fd, fd2)" 会先关闭 "fd2"。"inheritable" 参数决定复制后的文件描述符是否可以被子进程继承,默认为 True。 | ||
os.fstat(fd) | 获取一个打开的文件描述符的状态信息。它返回一个 "os.stat_result" 对象,该对象包含了文件的各种属性,如文件大小、文件的最后访问/修改/创建时间等。os.fstat(fd) 返回的 os.stat_result 对象包含以下属性: st_mode:保护位,描述文件的类型和文件的访问权限。 st_ino:inode number,文件在文件系统中的编号。 st_dev:设备标识符,定义了文件所在的设备。 st_nlink:链接数,表示文件名和实际文件之间的链接数。 st_uid:用户ID,文件所有者的用户ID。 st_gid:组ID,文件所有者的组ID。 st_size:文件的大小,以字节为单位。 st_atime:最后访问时间,文件最后一次被访问或运行的时间。 st_mtime:最后修改时间,文件数据最后一次被修改的时间。 st_ctime:创建时间,在某些系统上(如Unix)是文件状态最后一次改变的时间,在其他系统(如Windows)是文件创建时间。 st_blocks:文件的数据块数,不在所有的系统上都可用。 st_blksize:文件系统的I/O优化的块大小。 | 参数 "fd" 是一个整数,表示需要获取状态信息的文件描述符 | ||
os.ftruncate(fd, length) | 将一个打开的文件的大小设置为特定的长度。如果文件原来的大小大于 "length",则超过的部分将会被丢弃。如果文件原来的大小小于 "length",则文件将会被扩展,新增的部分的内容依赖于操作系统的实现(在某些系统上,新增的部分可能会被填充为0) | 参数 "fd" 是一个整数,表示需要进行截断操作的文件描述符。"length" 也是一个整数,表示文件新的大小。 | ||
os.isatty(fd) | 检查一个文件描述符是否连接到一个终端设备。这在需要确定一个文件描述符是否可以进行交互式I/O操作时很有用。例如,在一个脚本中,你可能需要确定是否可以向用户显示一些提示信息,或者是否可以从用户那里获取一些交互式的输入。在这些情况下,你可以使用 "os.isatty()" 来检查标准输入/输出/错误流是否连接到一个终端设备。 | 参数 "fd" 是一个整数,表示需要检查的文件描述符。 | ||
os.lseek(fd, pos, whence) | 移动文件描述符fd的读写位置。这是通过添加一个偏移量pos到一个参考点来实现的,这个参考点由whence参数决定。 | "fd"是文件描述符,一个整数,它代表了一个已打开的文件。 - "pos"是偏移量,一个整数,它表示从参考点移动的字节数量。pos可以是负数,这表示从参考点向后移动。 - "whence"参数是一个整数,用于选择参考点。它有三个可能的值:"os.SEEK_SET"(或0)表示文件的开头;"os.SEEK_CUR"(或1)表示当前的读写位置;"os.SEEK_END"(或2)表示文件的结尾 | ||
os.SEEK_SET、os.SEEK_CUR、os.SEEK_END | 操作系统"os"模块中定义的三个常量,用于在调用"os.lseek()"函数时指定偏移量的基点。os.SEEK_SET:值为0,将文件的指针位置设置为距离文件开始位置"pos"个字节;os.SEEK_CUR:值为1,将文件的指针位置设置为当前位置加上"pos"个字节。"pos"可以为负,这表示从当前位置向前移动;os.SEEK_END:值为2,:将文件的指针位置设置为文件的结尾加上"pos"个字节。"pos"通常为负,这表示从文件的结尾向前移动,"pos"为0时表示移动到文件的末尾。 | |||
os.open(path, flags, mode=0o777, *, dir_fd=None) | 打开一个文件,并返回一个文件描述符,该文件描述符后续可用于对文件进行读写操作。 | "path" 是一个字符串,表示要打开的文件的路径。 - "flags" 是一个整数,表示打开文件的方式和模式。这个参数可以是以下值或其组合: - "os.O_RDONLY":以只读方式打开文件。 - "os.O_WRONLY":以只写方式打开文件。 - "os.O_RDWR":以读写方式打开文件。 - "os.O_CREAT":如果文件不存在,则创建新文件。 - "os.O_TRUNC":如果文件已存在,并且以写方式打开,则清空文件内容。 - "mode" 是一个可选参数,表示文件的权限。默认值为 "0o777"。只有在"flags"参数包含"os.O_CREAT"时,"mode"参数才会生效。 - "dir_fd" 是一个可选参数,它是一个文件描述符,用于指定查找开始的目录。默认值为 "None",表示使用当前工作目录作为开始目录 | ||
os.pipe() | 创建一个管道,并返回一个包含两个文件描述符的元组,它返回一个包含两个文件描述符的元组:"(read_fd, write_fd)"。一个进程可以通过 "read_fd" 文件描述符从管道中读取数据,而另一个进程可以通过 "write_fd" 文件描述符向管道中写入数据。这种机制通常用于进程间通信(IPC) | |||
os.read(fd, n) | 文件描述符fd所引用的文件中读取最多n个字节,并返回一个包含读取字节的字节字符串。 | "fd" 是一个文件描述符,它引用了一个已打开的文件或者管道。 - "n" 是一个整数,表示要读取的最大字节数。 | ||
os.write(fd, str) | 向文件或者管道写入数据。它接受一个字节字符串作为参数,并将这个字节字符串写入到文件或者管道中。"os.write()" 函数返回的是实际写入的字节数。注意,这个数值可能少于 "str" 的长度,这表示只有部分数据被写入。这种情况通常发生在磁盘空间不足或者达到了文件大小限制时。 | "fd" 是一个文件描述符,它引用了一个已打开的文件或者管道。 - "str" 是一个字节字符串,表示要写入的数据。 | ||
os.popen() | 从一个 shell 命令打开一个管道。这个函数创建一个子进程,执行命令,然后返回一个连接到子进程的标准输入、输出或错误管道的文件对象。 | "command": shell命令字符串 - "mode": 模式字符串,可选,默认为 'r'。'r' 表示读,'w' 表示写。 - "bufsize": 缓冲区大小,可选。0表示无缓冲;1表示行缓冲;其他正数表示使用参数作为缓冲区大小;负数表示使用系统默认缓冲。 |
代码如何实现?
各位小可爱需要先导入os库,然后应用具体的函数,代码实现如下所示,
# -*- coding: UTF-8 -*-
import os
path='C:\\Users\\Administrator\\Desktop\\page'
path2='C:\\Users\\Administrator\\Desktop\\page2'
fd=os.open('C:\\Users\\Administrator\\Desktop\\page2\\a.txt',os.O_CREAT)
fd2=os.open('C:\\Users\\Administrator\\Desktop\\page2\\b.txt',os.O_CREAT)
#os.close(fd)
#os.closerange(fd,fd2)
#print(os.device_encoding(fd))
#print(os.dup(fd))
#print(os.dup2(fd,fd2))
#print(os.fstat(fd))
#print(os.ftruncate(fd,1024))
#print(os.isatty(fd))
#print(os.lseek(fd,2,os.SEEK_SET))
#print(os.open(path2,os.O_RDONLY))
#print(os.pipe())
#print(os.read(fd,1))
#os.write(fd,'aa')
#print(os.popen(path))