Python 路径操作新标准:
pathlib
模块相较于老式的os.path
更为简洁易用,本文为该模块的使用教程。
pathlib
库从 Python 3.4 开始,到 Python 3.6 已经比较成熟。如果你的新项目可以直接用 3.6 及以上,建议用 pathlib
。相比于老式的 os.path
有几个优势:
- 老的路径操作函数管理比较混乱,有的是导入
os
,有的又是在os.path
当中,而新的用法统一可以用pathlib
管理。 - 老用法在处理不同操作系统 Win、Mac 以及 Linux 之间很吃力。换了操作系统常常要改代码,还经常需要进行一些额外操作。
- 老用法主要是函数形式,返回的数据类型通常是字符串。但是路径和字符串并不等价,所以在使用
os
操作路径的时候常常还要引入其他类库协助操作。新用法是面向对象,处理起来更灵活方便。 pathlib
简化了很多操作,用起来更轻松。
1. 路径获取
(1)获取当前工作目录
1 | print(pathlib.Path.cwd()) # D:\Dive into Deep Learning\src |
注意:工作目录是在哪个目录下运行你的程序,不是项目目录。
虽然在这里打印出来的很像一个字符串,但实际上得到的是一个 WindowsPath('D:\Dive into Deep Learning\src')
对象,如果只想得到字符串表示,不想要 WindowsPath
对象,可以用 str()
转化。
(2)获取用户 Home 目录
1 | print(pathlib.Path.home()) # C:\Users\AsanoSaki |
(3)获取当前文件路径
1 | print(pathlib.Path(__file__)) # D:\Dive into Deep Learning\src\路径操作.py |
(4)获取任意字符串路径
1 | dir_path = pathlib.Path('../images') |
(5)获取绝对路径
1 | print(dir_path.resolve()) # D:\Dive into Deep Learning\images |
(6)获取文件属性
文件属性比如文件大小、创建时间、修改时间等。
1 | print(file_path.stat()) # os.stat_result(st_mode=33206, st_ino=281474978388098, st_dev=80873957, st_nlink=1, st_uid=0, st_gid=0, st_size=53081, st_atime=1680229254, st_mtime=1670460384, st_ctime=1680228818) |
2. 路径组成部分
获取路径的组成部分非常方便:
.name
:文件名,包含后缀名,如果是目录则获取目录名。.stem
:文件名,不包含后缀。.suffix
:后缀,比如.txt
、.png
。.parent
:父级目录,相当于cd ..
。.anchor
:锚,目录前面的部分C:\
或者/
。
1 | print(file_path.name) # cat1.jpg |
3. 子路径扫描
(1)扫描某个目录下的所有路径
1 | all_path = [str(p) for p in dir_path.iterdir() if dir_path.is_dir()] |
(2)使用模式匹配(正则表达式)查找目录下的指定文件
1 | all_jpg = list(dir_path.glob('*.jpg')) |
(3)检查路径是否符合规则
1 | print(file_path.match('*.jpg')) # True |
4. 路径拼接
pathlib
支持用 /
拼接路径,如果用不惯 /
,也可以用类似 os.path.join
的方法:
1 | print(dir_path / 'dir1' / 'file1.txt') # ..\images\dir1\file1.txt |
5. 路径测试(判断)
1 | print(dir_path.is_file()) # 是否为文件,False |
6. 文件操作
(1)创建文件
1 | new_file = pathlib.Path('../images/readme.txt') |
exist_ok
表示当文件已经存在时,程序的反应。如果为 True
,文件存在时,不进行任何操作;如果为 False
,则会报 FileExistsError
错误。
(2)创建目录
用 os
创建目录分为两个函数:mkdir()
和 makedirs()
。mkdir()
一次只能创建一级目录,makedirs()
可以同时创建多级目录。使用 pathlib
只需要用 path.mkdir()
函数就可以。它提供了 parents
参数,设置为 True
可以创建多级目录,不设置则只能创建一层:
1 | new_dir = pathlib.Path('../images/dir1/dir2') |
(3)删除目录
删除目录非常危险,并且没有提示,一定要谨慎操作。一次只删除一级目录,且当前目录必须为空:
1 | del_dir = pathlib.Path('../images/dir') |
(4)删除文件
1 | del_file = pathlib.Path('../images/readme.txt') |