【python 内置模块】pathlib

2024-01-20 00:00:00

python3.4 新增模块,可以处理路径和文件相关操作。

目录:

创建 Path 对象

from pathlib import Path

# 从字符串创建
Path('/home/user/data.txt')     # /home/user/data.txt

# 当前 python 文件的路径
Path(__file__)                  # /Users/dkvirus/Documents/test_sample.py
# 当前 python 文件的父级目录
Path(__file__).parent           # /Users/dkvirus/Documents
# 当前 python 文件的父级目录的父级目录
Path(__file__).parent.parent    # /Users/dkvirus

# 当前工作目录
Path.cwd()                      # /Users/dkvirus/Documents
# 用户主目录
Path.home()                     # /Users/dkvirus

路径组成

p = Path('/home/user/project/src/main.py')
print(p.name)      # 'main.py', 文件名
print(p.stem)      # 'main',     不带后缀的文件名
print(p.suffix)    # '.py',      文件扩展名
print(p.parent)    # /home/user/project/src,父目录
print(p.parts)     # ('/', 'home', 'user', 'project', 'src', 'main.py'),路径各部分元组
print(p.anchor)    # '/',锚点(如Windows的驱动器)

路径拼接

使用 / 运算符可以轻松拼接路径

base = Path('/usr')
config_path = base / 'local' / 'etc' / 'app.conf'
print(config_path)  # /usr/local/etc/app.conf

路径与文件类型

可以方便地检查路径是否存在及其类型。

p = Path('some_file.txt')
if p.exists():      # 判断路径是否存在
    if p.is_file():
        print("这是一个文件")
    elif p.is_dir():
        print("这是一个目录")
    if p.is_symlink():
        print("这是一个符号链接")

目录创建

使用 mkdir(),parents=True 可创建多级父目录,exist_ok=True 可避免目录已存在时报错

Path('new_dir/sub_dir').mkdir(parents=True, exist_ok=True)

目录删除

Path('empty_dir').rmdir()              # 删除空目录

目录遍历

iterdir(): 遍历当前目录下的条目。
glob(): 使用通配符模式匹配文件。
rglob(): 递归地使用通配符匹配文件

for item in Path('.').iterdir():
    print(item.name)
for py_file in Path('src').glob('*.py'):    # 递归查找所有 .py 文件
    print(py_file)
for txt_file in Path('.').rglob('*.txt'):   # 递归查找所有 .txt 文件
    print(txt_file)

递归 ./data 目录,修改文件名。
如下示例:旧的文件 get_listtins.json 单词拼写错误,需要修改为 get_listings.json

from pathlib import Path

def rename_files_recursively(root_dir: Path):
    # 定义要查找的原始文件名和新文件名
    old_filename = "get_listtins.json"
    new_filename = "get_listings.json"

    for file_path in root_dir.rglob(old_filename):
        try:
            parent_dir = file_path.parent
            new_file_path = parent_dir / new_filename
            if new_file_path.exists():
                print(f"警告:目标文件已存在,跳过重命名:{file_path}")
                continue
            file_path.rename(new_file_path)
            print(f"已重命名:{file_path} -> {new_file_path}")
        except Exception as e:
            print(f"重命名失败:{file_path},错误:{e}")

if __name__ == "__main__":
    # 设置要遍历的根目录
    data_dir = Path("./data")
    
    # 执行重命名操作
    rename_files_recursively(data_dir)
    
    print("-" * 50)
    print("重命名操作完成")

文件读写

Path 对象提供了便捷的读写方法

p = Path('hello.txt')

p.write_text('Hello, World!')          # 写入文本
content = p.read_text()                # 读取文本

p.write_bytes(b'Binary data')          # 写入字节
data = p.read_bytes()                  # 读取字节

写入/读取 json 文件。

import json
from pathlib import Path

p = Path('./test.json')

# 写入 json 文件
p.write_text(json.dumps({
    "name": "dkvirus",
    "age": 31,
}))

# 读取 json 文件
print(json.loads(p.read_text()))

文件创建

使用 touch() 方法可以创建一个空文件,如果文件已存在,可通过 exist_ok=True 参数控制是否报错。

Path('newfile.txt').touch(exist_ok=True)