之前如果要使用 python 操作文件路径,我总是会条件反射导入 os.path。 而现在,我会更加喜欢用新式的 pathlib, 虽然用得还是没有 os.path 熟练,但是以后会坚持使用。
pathlib 库从 python3.4 开始,到 python3.6 已经比较成熟。如果你的新项目可以直接用 3.6 以上,建议用 pathlib。相比于老式的 os.path 有几个优势:
-
老的路径操作函数管理比较混乱,有的是导入 os, 有的又是在 os.path 当中,而新的用法统一可以用 pathlib 管理。 -
老用法在处理不同操作系统 win,mac 以及 linux 之间很吃力。换了操作系统常常要改代码,还经常需要进行一些额外操作。 -
老用法主要是函数形式,返回的数据类型通常是字符串。但是路径和字符串并不等价,所以在使用 os 操作路径的时候常常还要引入其他类库协助操作。新用法是面向对象,处理起来更灵活方便。 -
pathlib 简化了很多操作,用起来更轻松。
举个例子, 把所有的 txt 文本全部移动到 archive 目录当中(archive 目录必须存在)。
使用原来的用法:
import glob
import os
import shutil
获取运行目录下所有的 txt 文件。注意:不是这个文件目录下
print(glob.glob(’*.txt’))
for file_name in glob.glob(’*.txt’):
new_path = os.path.join(‘archive’, file_name)
shutil.move(file_name, new_path)
新的写法:
from pathlib import Path
Path("demo.txt").replace('archive/demo.txt')
这篇文章列举了 pathlib 的主要用法,细节知识有点多,我只会介绍 pathlib 的用法,不会每个都列举和 os 的区别。但是我会在文章最后放上主要操作使用 pathlib 和 os 的对比图。
最主要的路径操作,你可以参考国外一位大神总结的图:
1 路径获取
-
获取当前工作目录
>>> import pathlib
>>> pathlib.Path.cwd()
C:\Users\me\study
# WindowsPath('C:\Users\me\study')
虽然在这里打印出来的很像一个字符串,但实际上得到的是一个 WindowsPath('C:\Users\me\study')
对象。显示内容由 Path 类的 __repr__
定义。
注意
工作目录是在哪个目录下运行你的程序,不是项目目录。
如果你只想得到字符串表示,不想要 WindowsPath 对象,可以用 str() 转化:
>>> str(pathlib.Path.cwd())
C:\Users\me\study
-
获取用户 home 目录。
下面的例子因为基本都是使用 pathlib 下面的 Path 类,所以可以换一种导入方式。
from pathlib import Path
>>> Path.home()
c:\Users\me
-
获取当前文件路径
>>> Path(__file__)
demo_01.py
在 pycharm 中右击运行和在 cmd 运行的结果会不同。pycharm 会显示全路径,cmd 运行只会显示工作目录下的相对路径。如果想统一,可以添加后缀 .resolve()
转化成绝对路径,这个在后面还会提到。
-
获取任意字符串路径
>>> Path('subdir/demo_02.py')
subdir\demo_02.py
>>> Path('c:d:y/rad.txt')
c:d:y\rad.txt
这里需要注意 2 点:
-
不管字符串使用的是正斜杠 /
还是反斜杠\
, 在 windows 系统里,得到的路径都是反斜杠\
, pathlib 会根据操作系统智能处理。 -
第二个例子中字符串会被 /
分割,c:d:y
会被当做一个目录名字,pathlib 不会去判断这个文件真的存在哦。
-
获取绝对路径
只需要在任意路径对象后添加方法 .resolve()
就能获取路径的绝对路径。如果填入的路径是相对路径(windows 下没有盘符,linux 没有 / 开头),则会在当前工作目录后添加路径。如果是已经是绝对路