Python路径操作模块pathlib教程

  1. 1. 路径获取
  2. 2. 路径组成部分
  3. 3. 子路径扫描
  4. 4. 路径拼接
  5. 5. 路径测试(判断)
  6. 6. 文件操作

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
2
print(pathlib.Path.cwd())  # D:\Dive into Deep Learning\src
print(str(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
2
3
dir_path = pathlib.Path('../images')
file_path = pathlib.Path('../images/cat1.jpg')
print(dir_path) # ..\images

(5)获取绝对路径

1
print(dir_path.resolve())  # D:\Dive into Deep Learning\images

(6)获取文件属性

文件属性比如文件大小、创建时间、修改时间等。

1
2
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)
print(file_path.stat().st_size) # 53081

2. 路径组成部分

获取路径的组成部分非常方便:

  • .name:文件名,包含后缀名,如果是目录则获取目录名。
  • .stem:文件名,不包含后缀。
  • .suffix:后缀,比如 .txt.png
  • .parent:父级目录,相当于 cd ..
  • .anchor:锚,目录前面的部分 C:\ 或者 /
1
2
3
4
print(file_path.name)  # cat1.jpg
print(file_path.stem) # cat1
print(file_path.suffix) # .jpg
print(file_path.parent) # ..\images

3. 子路径扫描

(1)扫描某个目录下的所有路径

1
2
all_path = [str(p) for p in dir_path.iterdir() if dir_path.is_dir()]
print(all_path) # ['..\\images\\cat1.jpg', '..\\images\\cat2.jpg', '..\\images\\cat3.jpg', '..\\images\\catdog.jpg']

(2)使用模式匹配(正则表达式)查找目录下的指定文件

1
2
3
4
all_jpg = list(dir_path.glob('*.jpg'))
all_jpg_strpath = [str(p) for p in all_jpg]
print(all_jpg) # [WindowsPath('../images/cat1.jpg'), WindowsPath('../images/cat2.jpg'), WindowsPath('../images/cat3.jpg'), WindowsPath('../images/catdog.jpg')]
print(all_jpg_strpath) # ['..\\images\\cat1.jpg', '..\\images\\cat2.jpg', '..\\images\\cat3.jpg', '..\\images\\catdog.jpg']

(3)检查路径是否符合规则

1
print(file_path.match('*.jpg'))  # True

4. 路径拼接

pathlib 支持用 / 拼接路径,如果用不惯 /,也可以用类似 os.path.join 的方法:

1
2
print(dir_path / 'dir1' / 'file1.txt')  # ..\images\dir1\file1.txt
print(dir_path.joinpath('dir1', 'file1.txt')) # ..\images\dir1\file1.txt

5. 路径测试(判断)

1
2
3
print(dir_path.is_file())  # 是否为文件,False
print(dir_path.is_dir()) # 是否为文件夹,True
print(dir_path.exists()) # 是否存在,True

6. 文件操作

(1)创建文件

1
2
3
new_file = pathlib.Path('../images/readme.txt')
new_file.touch(exist_ok=True)
new_file.touch(exist_ok=False) # FileExistsError: [Errno 17] File exists: '..\\images\\readme.txt'

exist_ok 表示当文件已经存在时,程序的反应。如果为 True,文件存在时,不进行任何操作;如果为 False,则会报 FileExistsError 错误。

(2)创建目录

os 创建目录分为两个函数:mkdir()makedirs()mkdir() 一次只能创建一级目录,makedirs() 可以同时创建多级目录。使用 pathlib 只需要用 path.mkdir() 函数就可以。它提供了 parents 参数,设置为 True 可以创建多级目录,不设置则只能创建一层:

1
2
3
new_dir = pathlib.Path('../images/dir1/dir2')
new_dir.mkdir() # FileNotFoundError: [WinError 3] The system cannot find the path specified: '..\\images\\dir1\\dir2'
new_dir.mkdir(parents=True)

(3)删除目录

删除目录非常危险,并且没有提示,一定要谨慎操作。一次只删除一级目录,且当前目录必须为空:

1
2
del_dir = pathlib.Path('../images/dir')
del_dir.rmdir()

(4)删除文件

1
2
del_file = pathlib.Path('../images/readme.txt')
del_file.unlink()