文章目录
- 8 文件和目录操作
- 8.7 浏览目录下的内容
- 8.8 查看文件或目录的信息
- 8.9 文件状态修改
- 文件标志位
- 文件权限
- 文件所属用户和组
- 其它
- 8.10 浏览Windows的驱动器、卷、挂载点
- 8.11 系统配置信息
os模块提供了各种操作系统接口。包括环境变量、进程管理、进程调度、文件操作等方面。
这里整理了文件操作的部分方法。
参考:os模块官方文档
os模块的方法和系统相关,且一些方法依赖python版本,测试时使用下面的在线工具:
在线python-3.12版本-Unix平台
8 文件和目录操作
8.7 浏览目录下的内容
-
os.listdir(path='.')
返回path指定目录下的条目的名称列表。
结果中不会包含特殊条目'.'
和'..'
。
path为字节串时,返回的结果也是字节串。>>> os.listdir("/") ['etc', 'sys', 'lib', 'srv', 'home', 'tmp', 'bin', 'boot', 'lib64', 'usr', 'dev', 'sbin', 'mnt', 'run', 'root', 'media', 'var', 'opt', 'proc', '.dockerenv']
-
os.scandir(path='.')
返回类os.DirEntry
类实例的迭代器,对应指定目录下的条目。
如果需要文件类型或属性信息,这个方法比os.listdir()
更好用。因为os.DirEntry
对象包含了这些信息。
scandir()
支持上下文管理器:with os.scandir(path) as it:for entry in it:if not entry.name.startswith('.') and entry.is_file():print(entry.name)
>>> os.scandir('/') <posix.ScandirIterator object at 0x7f5d787d7530> >>> list(os.scandir("/"))[:5] [<DirEntry 'etc'>, <DirEntry 'sys'>, <DirEntry 'lib'>, <DirEntry 'srv'>, <DirEntry 'home'>]
-
class os.DirEntry
os.scandir()
生成的对象,表示目录内某个条目的路径和文件属性。
它可以作为类路径对象使用。它的属性和方法的调用结果是缓存好的,如果文件源数据已更改,就需要使用os.stat()
获取最新的信息。它有以下属性和方法:
name
,文件名,是基于os.scandir()
的path参数的相对路径。path
,完整路径。os.scandir()
的path参数为绝对路径时,该属性就为绝对路径;path参数是文件描述符,则该属性和name属性相同。isnode()
返回条目的索引节点号。is_dir(*, follow_symlinks=True)
条目是否为目录或指向目录的符号链接。is_file(*, follow_symlinks=True)
条目是否为文件或指向文件的符号链接。is_symlink()
条目是否为符号链接(断开的链接也算)。is_junction()
条目是否为接合点(断开也算)。stat(*, follow_symlinks=True)
返回条目对应的os.stat_result
对象。
-
os.walk(top, topdown=True, onerror=None, followlinks=False)
生成目录树中的文件名,方式为从上到下或从下到上浏览目录树。以top为根,目录树中的每个目录都会生成一个三元组
(dirpath, dirnames, filenames)
。dirpath
表示目录的路径,dirnames
是dirpath
中的子目录名称组成的列表。filenames
是dirpath
中非目录文件组成的列表。列表中的名称不包含路径部分。topdown为True时先生成父目录的三元组,为False时先生成子目录的三元组。topdown为True时,就地修改
dirnames
列表,后续只会在dirnames
中的内容做查找。这样做可以减少搜索、加入特定的访问顺序。topdown为False时,修改dirnames
不影响后续检索,因为dirnames
在dirpath
之前就已经生成了。top为相对路径时,在
os.walk()
返回前不要更改工作目录。
followlinks设置为True时,对于指向父目录的链接,会出现无限递归。>>> os.walk("/") <generator object walk at 0x7f905bf94040> >>> list(os.walk("/"))[:1] [('/', ['etc', 'sys', 'lib', 'srv', 'home', 'tmp', 'bin', 'boot', 'lib64', 'usr', 'dev', 'sbin', 'mnt', 'run', 'root', 'media', 'var', 'opt', 'proc'], ['.dockerenv'])]
-
os.fwalk(top='.', topdown=True, onerror=None, *, dir_fd=None, follow_symlinks=False)
效果和os.walk()
一样,不过产生四元组(dirpath, dirnames, filenames, dirfd)
,dirfd是指向dirpath的文件描述符。
8.8 查看文件或目录的信息
-
os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)
使用实际用户ID/用户组ID测试对path的访问。参数mode指定对path做什么测试:
os.F_OK
(是否存在)、os.R_OK
(可读)、os.W_OK
(可写)、os.X_OK
(可执行)。参数effective_ids为True时,将使用有效用户ID/用户组ID而不是实际用户ID/用户组ID。可以用
os.supports_effective_ids
检测是否支持使用有效用户ID/用户组ID。os.access()
方法指示I/O操作会成功,但是实际可能失败,尤其是对网络文件系统的操作。 -
os.supports_effective_ids
一个集合,表示当前平台上是否支持os.access()
的effective_ids
指定为True。不支持时集合为空。>>> os.supports_effective_ids {<built-in function access>}
-
os.stat(path, *, dir_fd=None, follow_symlinks=True)
获取文件或描述符的状态。返回一个os.stat_result
对象。>>> os.stat('.') os.stat_result(st_mode=16895, st_ino=2814749767298829, st_dev=86, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1740675232, st_mtime=1740675232, st_ctime=1740675232)
-
os.lstat(path, *, dir_fd=None)
类似于os.stat
,但不会跟随符号链接。
返回一个类os.stat_result
的实例。 -
class os.stat_result
这个类用于os.stat()
、os.fstat()
、os.lstat
的输出。
它有以下属性:st_mode
,文件模式,包括文件类型和权限;st_ino
,文件的索引节点号;st_dev
,文件所在设备的标识符;st_nlink
,硬链接数目;st_uid
,所有者的用户ID;st_gid
,所有者的组ID;st_size
,文件大小(字节),符号链接的大小是它包含的路径的长度;st_atime
,最近访问时间(秒);st_mtime
,最近修改时间(秒);st_ctime
,元数据最近更改的时间(秒);st_atime_ns
,最近访问时间(纳秒);st_mtime_ns
,最近修改时间(纳秒);st_ctime_ns
,元数据最近更改的时间(纳秒);st_birthtime
,文件创建时间(秒);st_birthtime_ns
,文件创建时间(纳秒);st_blocks
,文件的字节块数,每块512字节;st_blksize
,块大小;st_rdev
,设备类型;st_flags
,用户定义的文件标志位;st_gen
,文件生成号;st_fstype
,文件所在的文件系统的类型的唯一标识符;st_rsize
,文件的实际大小;st_creator
,文件的创建者;st_type
,文件类型;
上述时间属性的值依赖于操作系统的精度。
-
os.statvfs(path)
返回所在的文件系统信息。仅Unix可用。>>> os.statvfs(".") os.statvfs_result(f_bsize=4096, f_frsize=4096, f_blocks=244186111, f_bfree=83501754, f_bavail=83501754, f_files=999, f_ffree=1000000, f_favail=1000000, f_flag=1024, f_namemax=255)
8.9 文件状态修改
文件标志位
os.chflags(path, flags, *, follow_symlinks=True)
把path的flags设置为其他由数字表示的flags。
flags的值在stat
模块中定义。os.lchflags(path, flags)
把path的flags设置为其他数字表示的flags。
文件权限
os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)
把path的权限改为其他mode表示的权限。
mode的可选值在stat
模块中定义。os.lchmod(path, mode)
把path的mode改为其他数字表示的mode。
等效于os.chmod(path, mode, follow_symlinks=False)
文件所属用户和组
-
os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)
修改path的用户和组ID。uid、gid设置为-1时表示不做修改。 -
os.lchown(path, uid, gid)
修改path的用户和组ID。
等效于os.chown(path, uid, gid, follow_symlinks=False)
。 -
os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True)
设置文件的访问时间和修改时间。
times不为None时,必须是(atime, mtime)
形式的二元组,成员是表示秒的整数或浮点数。
times为None,指定ns时,ns必须是纳秒组成的二元组(atime_ns, mtime_ns)
;
times为None且未指定ns时,相当于以当前时间指定ns=(atime_ns, mtime_ns)
。
同时指定times和ns会出错。
其它
os.sync()
强制将所有内容写入磁盘。os.truncate(path, length)
截断文件,使其最大为length大小。
8.10 浏览Windows的驱动器、卷、挂载点
-
os.listdrives()
返回系统的驱动器名称列表。>>> os.listdrives() ['C:\\', 'D:\\']
-
os.listvolumes()
返回一个包含系统中卷的列表。 -
os.listmounts(volume)
返回指定卷的挂载点的列表。
volume必须是GUID路径,如os.listvolumes()
返回的值。>>> os.listvolumes() ['\\\\?\\Volume{02cf02ce-0000-0000-0000-100000000000}\\', '\\\\?\\Volume{d29ac86d-e09b-40da-b12c-87d386a77303}\\', '\\\\?\\Volume{fc57ca93-ead3-4d89-9578-543426fafadf}\\', '\\\\?\\Volume{836efff0-1021-4a45-8c98-aa445d4d836a}\\'] >>> os.listmounts(os.listvolumes()[1]) ['C:\\']
8.11 系统配置信息
-
os.pathconf(path, name)
返回所给名称的文件的系统配置信息。 -
os.pathconf_names
当前系统定义的配置名称字典。
是os.pathconf()
和os.fpathconf()
两个函数可接受的名称和整数值之间的映射。>>> os.pathconf_names {'PC_ALLOC_SIZE_MIN': 18, 'PC_ASYNC_IO': 10, 'PC_CHOWN_RESTRICTED': 6, 'PC_FILESIZEBITS': 13, 'PC_LINK_MAX': 0, 'PC_MAX_CANON': 1, 'PC_MAX_INPUT': 2, 'PC_NAME_MAX': 3, 'PC_NO_TRUNC': 7, 'PC_PATH_MAX': 4, 'PC_PIPE_BUF': 5, 'PC_PRIO_IO': 11, 'PC_REC_INCR_XFER_SIZE': 14, 'PC_REC_MAX_XFER_SIZE': 15, 'PC_REC_MIN_XFER_SIZE': 16, 'PC_REC_XFER_ALIGN': 17, 'PC_SOCK_MAXBUF': 12, 'PC_SYMLINK_MAX': 19, 'PC_SYNC_IO': 9, 'PC_VDISABLE': 8}
以上是os模块关于文件和目录操作的一部分函数的整理。
该模块的其他内容参考:
os模块:环境变量、进程所属的用户和组
os模块:进程管理
os模块:调度策略、系统信息
os模块:文件和目录1
os模块:文件描述符操作1
os模块:文件描述符操作2