对于 Python 中的路径操作,大多数人第一反应肯定是 os,可以说 os 已经在老一辈 Python coder 心中扎深蒂固,现存的很多教程中操作路径仍然使用 os,殊不知从 python3.4 开始,pathlib 正式成为标准库,已经能够完全取代 os。无论从功能还是易用性都已经超越 os。
看个经典的例子,我们分别使用 os 与 pathlib 来获取上层目录和上上层目录。
os 方法
import os.path # 获取上层目录 os.path.dirname(os.getcwd()) # 获取上上层目录 os.path.dirname(os.path.dirname(os.getcwd())) 复制代码
pathlib 方法
from pathlib import Path # 获取上层目录 Path.cwd().parent # 获取上上层目录 Path.cwd().parent.parent 复制代码
[链式调用]完败[嵌套调用],pathlib 是面向对象的模块,使用起来非常灵活方便,下面就详细看看 pathlib 常见操作。建议大家收藏备用!
- 安装 pathlib 模块
- pathlib常见操作
- 获取绝对路径
- 创建文件/目录
- 文件/目录判断
- 路径拼接/拆分
- 获取文件/目录信息
- 遍历目录
- 重命名/移动文件
- 删除文件/目录
安装 pathlib 模块
通过命令行直接安装。
pip install pathlib 复制代码
也可以使用豆瓣镜像安装。
pip install -i https://pypi.douban.com/simple pathlib 复制代码
执行上述命令后,可以检查一下是否安装成功。
pip show pathlib 复制代码
pathlib常见操作
获取绝对路径
获取当前绝对路径,两种方法。
>>> Path().cwd() WindowsPath('E:/material/pathlib用法') >>> Path().resolve() WindowsPath('E:/material/pathlib用法') 复制代码
创建文件/目录
创建目录时要注意两个参数:
parents
:默认为 False,如果父目录不存在,会抛出异常,True 则创建这些目录。exist_ok
:默认为 False,目录已存在时会抛出异常。
这里我们在 material 目录下创建 test 文件夹。
>>> p = Path(r'E:\material\test') >>> p.mkdir(parents=True, exist_ok=True) 复制代码
touch()
用于创建空文件,父级目录必须存在,否则抛出异常。
>>> p = Path('E:/material/test1.txt') >>> p.touch(exist_ok=True) 复制代码
文件/目录判断
判断是否为文件夹
>>> Path('E:/material/pathlib用法').is_dir() True 复制代码
判断是否为文件
>>> Path('E:/material/pathlib用法/txt文件.txt').is_file() True 复制代码
判断路径是否存在
>>> Path('E:/material/error.txt').exists() False 复制代码
路径拼接/拆分
Path类路径拼接的两种方法。
>>> Path('E:/material', 'pathlib用法') WindowsPath('E:/material/pathlib用法') >>> Path.cwd().parent.joinpath('pathlib用法') WindowsPath('E:/material/pathlib用法') 复制代码
使用 '/'
进行路径拼接。
Path Object / Path Object
str / Path Object
Path Object / str
>>> Path('E:/') / Path('/material/') WindowsPath('E:/material') >>> 'E:/' / Path('/material/') WindowsPath('E:/material') >>> Path('E:/') / '/material/' WindowsPath('E:/material') 复制代码
按照分隔符将文件路径分割
>>> p.parts ('E:\\', 'material', 'pathlib用法') 复制代码
获取文件/目录信息
获取文件/目录名。
>>> p = Path('E:/material/pathlib用法/excel文件.xlsx') >>> p.name 'excel文件.xlsx' 复制代码
获取不包含后缀的文件名。
>>> p.stem 'excel文件' 复制代码
获取文件后缀名。
>>> p.suffix '.xlsx' 复制代码
获取锚,最前面的部分 E:\
。
>>> p.anchor 'E:\\' 复制代码
获取上层目录路径
>>> p = path.cwd() >>> p.parent WindowsPath('E:/material') 复制代码
获取所有上层目录路径
>>> [path for path in p.parents] [WindowsPath('E:/material'), WindowsPath('E:/')] 复制代码
获取文件/目录属性。
>>> p.stat() os.stat_result(st_mode=33206, st_ino=562949953976250, st_dev=503425376, st_nlink=1, st_uid=0, st_gid=0, st_size=6611, st_atime=1642130252, st_mtime=1642062067, st_ctime=1642066962) 复制代码
获取文件/目录大小,单位字节(B)
>>> p.stat().st_size 6611 复制代码
获取文件/目录修改时间。
>>> p.stat().st_mtime 1642062067.4264374 复制代码
获取文件/目录创建时间。
>>> p.stat().st_ctime 1642066962.072431 复制代码
上面获取的时间都是时间戳,通过 datetime
模块转成标准日期格式。
>>> from datetime import datetime >>> date = datetime.utcfromtimestamp(p.stat().st_ctime) >>> date.strftime("%Y-%m-%d %H:%M:%S") '2022-01-13 09:42:42' 复制代码
遍历目录
示例文件夹
┌ .ipynb_checkpoints ├ └ Pathlib用法-checkpoint.ipynb ├ csv文件.csv ├ excel文件.xlsx ├ Pathlib用法.ipynb ├ py文件.py └ txt文件.txt 复制代码
遍历目录下所有文件,返回一个包含结果路径的迭代器。
>>> p = Path.cwd() >>> [path for path in p.iterdir()] [WindowsPath('E:/material/pathlib用法/.ipynb_checkpoints'), WindowsPath('E:/material/pathlib用法/csv文件.csv'), WindowsPath('E:/material/pathlib用法/excel文件.xlsx'), WindowsPath('E:/material/pathlib用法/Pathlib用法.ipynb'), WindowsPath('E:/material/pathlib用法/py文件.py'), WindowsPath('E:/material/pathlib用法/txt文件.txt')] 复制代码
根据指定正则匹配目录下的文件,不匹配子目录内的文件。
>>> [path for path in p.glob('*.txt')] [WindowsPath('E:/material/pathlib用法/txt文件.txt')] 复制代码
根据指定正则匹配目录下的文件,匹配子目录内的文件。
>>> [path for path in p.rglob('*.ipynb')] [WindowsPath('E:/material/pathlib用法/Pathlib用法.ipynb'), WindowsPath('E:/material/pathlib用法/.ipynb_checkpoints/Pathlib用法-checkpoint.ipynb')] 复制代码
重命名/移动文件
rename()
重命名文件,当新命名的文件重复时,会抛出异常。下面我们将 test1.txt
文件先重命名为 test2.txt
,再修改后缀名为 test2.json
。
>>> p = Path('E:/material/test1.txt') >>> new_name = p.with_name('test2.txt') >>> p.rename(new_name) WindowsPath('E:/material/test2.txt') >>> new_suffix = new_name.with_suffix('.json') >>> new_name.rename(new_suffix) WindowsPath('E:/material/test2.json') 复制代码
移动文件,当新路径下文件已存在时,无法创建该文件。
>>> p = Path('E:/material/test2.txt') >>> p.rename('E:/material/pathlib用法/test3.txt') WindowsPath('E:/material/pathlib用法/test3.txt') 复制代码
replace()
replace()
与 rename()
用法基本相同,唯一不同点就是当新命名的文件重复时,replace()
不会抛出异常,而是直接覆盖旧文件。
删除文件/目录
删除文件,missing_ok=True
设置文件不存在不会抛出异常。
>>> p = Path('E:/material/pathlib用法/not_exist.txt') >>> p.unlink(missing_ok=True) 复制代码
删除目录,目录必须为空,否则抛出异常。
>>> p = Path('E:/material/pathlib用法/test') >>> p.rmdir()