pathlib一个优雅的路径操作模块,碾压os!

简介: pathlib一个优雅的路径操作模块,碾压os!

对于 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()



相关文章
os模块和sys模块
os模块和sys模块
|
8天前
|
Python
python之os模块
python之os模块
|
4天前
|
Python
使用 os 模块更高效地读写文件
使用 os 模块更高效地读写文件
7 0
|
5天前
|
移动开发 Unix Linux
30天拿下Python之os模块
30天拿下Python之os模块
|
2月前
|
存储 JavaScript 前端开发
nodejs os模块
nodejs os模块
30 0
|
3月前
|
弹性计算 运维 安全
【实践】使用操作系统智能助手OS Copilot解锁操作系统运维与编程
体验阿里云OS Copilot,运维人员进行Linux环境配置,包括初始化、修改密码和设置端口。工具提供知识问答、辅助编程功能,能理解口语化指令,但对复杂编程任务有限制。作为运维,给予产品8分,愿意推荐并参与开源开发。产品优点在于准确度,期待扩展更多语言支持和智能故障排查。不足之处包括资源续费说明不清、特定问题回答不准确和需实时学习更新。
|
4月前
|
Python
python--os模块
python--os模块
|
4月前
|
Python
Python的`os`模块核心功能概述:通过`os.getcwd()`获取
【6月更文挑战第23天】Python的`os`模块核心功能概述:通过`os.getcwd()`获取、`os.chdir()`改变工作目录;使用`os.mkdir()`, `os.makedirs()`创建目录,`os.rmdir()`, `os.removedirs()`删除;`os.rename()`, `os.renames()`重命名文件或目录;`os.remove()`删除文件;`os.listdir()`列出目录内容;`os.path.exists()`, `os.path.isfile()`, `os.path.isdir()`检查路径;`os.stat()`获取文件属性。
81 4
|
4月前
|
Unix Shell Python
Python教程:开箱即用的Python os模块知识
注:文末有福利小工具源码 Python 的 os 模块提供了许多接口用于与操作系统进行交互,包括文件操作、目录操作、路径操作、环境变量操作、系统信息获取等
37 1
|
3月前
|
Python
在Python中,`os`模块提供了与操作系统交互的多种方式。
在Python中,`os`模块提供了与操作系统交互的多种方式。
下一篇
无影云桌面