当前位置: 欣欣网 > 办公

pathlib:一个比os更优雅的路径操作模块

2024-03-22办公

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

    以上就是 pathlib 常见操作,足以解决日常工作中的绝大多数问题, 收藏,点赞,转发 支持一下吧!

    作者: Python丁小杰

    来源 :Python新视野

    Crossin的新书【 码上行动:用ChatGPT学会Python编程 】已经上市了。 本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。

    购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。

    Crossin的其他书籍:

    添加微信 crossin123 ,加入编程教室共同学习 ~

    感谢 转发 点赞 的各位~