Python pathlib 模块,遍历目录

文摘   科技   2025-01-12 22:26   上海  
点击蓝字,关注山海摸鱼人

目录:

  1. pathlib 模块简介
  2. Path类的基本使用
  3. 遍历目录
  4. 应用案例

pathlib 模块简介

在Python中,pathlib 模块是标准库的一部分,它在Python 3.4 版本中被引入。pathlib 模块提供了一组类来表示文件系统路径,这些类将文件路径作为对象来处理,使得文件路径的操作更加直观和方便,就像是在操作一个有各种功能的实体对象一样。

使用 pathlib 模块之前,我们需要先导入它。pathlib 模块中最常用的类是 Path,它代表一个文件系统路径。

from pathlib import Path  # 从pathlib模块导入Path类

Path类的基本使用

1、创建Path对象

我们可以使用不同的方式来创建 Path 对象。

  • 表示当前目录
from pathlib import Path

current_dir = Path('.')  # 使用点号表示当前目录创建Path对象
print(f"当前目录对象: {current_dir}")

输出结果

当前目录对象:.
  • 表示绝对路径
from pathlib import Path

# 在Windows系统上,路径分隔符是反斜杠,但为了避免转义问题,我们使用原始字符串
# 例如 r'C:\Users\your_name'
# 在Linux或macOS上,路径分隔符是正斜杠,例如 '/home/user'
abs_path = Path(r'C:\Users\山海摸鱼人\Documents')  # 表示绝对路径的Path对象
print(f"绝对路径对象: {abs_path}")

输出结果

绝对路径对象: C:\Users\山海摸鱼人\Documents
  • 通过路径拼接创建
from pathlib import Path

parent_dir = Path(r'C:\Users\山海摸鱼人')
sub_dir = 'Documents'
new_path = parent_dir / sub_dir  # 使用斜杠运算符进行路径拼接
print(f"拼接后的路径对象: {new_path}")

输出结果

拼接后的路径对象: C:\Users\山海摸鱼人\Documents

2、获取路径的属性

Path 对象有很多有用的属性,可以帮助我们获取路径的各种信息。

  • 获取绝对路径
from pathlib import Path

rel_path = Path('test.txt')
abs_path = rel_path.absolute()  # 获取绝对路径
print(f"相对路径 {rel_path} 的绝对路径是: {abs_path}")

输出结果

相对路径 test.txt 的绝对路径是: C:\Users\山海摸鱼人\test.txt
  • 获取文件名
from pathlib import Path

file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
file_name = file_path.name  # 获取文件名
print(f"文件路径 {file_path} 的文件名是: {file_name}")

输出结果

文件路径 C:\Users\山海摸鱼人\Documents\test.txt 的文件名是: test.txt
  • 获取文件扩展名
from pathlib import Path

file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
file_suffix = file_path.suffix  # 获取文件扩展名
print(f"文件路径 {file_path} 的文件扩展名是: {file_suffix}")

输出结果

文件路径 C:\Users\山海摸鱼人\Documents\test.txt 的文件扩展名是:.txt
  • 获取父目录
from pathlib import Path

file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
parent_dir = file_path.parent  # 获取父目录
print(f"文件路径 {file_path} 的父目录是: {parent_dir}")

输出结果

文件路径 C:\Users\山海摸鱼人\Documents\test.txt 的父目录是: C:\Users\山海摸鱼人\Documents

3、路径操作方法

Path 对象还提供了很多方法来进行路径操作。

  • 判断路径是否存在
from pathlib import Path

dir_path = Path(r'C:\Users\山海摸鱼人\Documents')
if dir_path.exists():
    print(f"路径 {dir_path} 存在")
else:
    print(f"路径 {dir_path} 不存在")

输出结果(假设路径存在)

路径 C:\Users\山海摸鱼人\Documents 存在
  • 判断是否为文件
from pathlib import Path

file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
if file_path.is_file():
    print(f"路径 {file_path} 是一个文件")
else:
    print(f"路径 {file_path} 不是一个文件")

输出结果(假设文件存在)

路径 C:\Users\山海摸鱼人\Documents\test.txt 是一个文件
  • 判断是否为目录
from pathlib import Path

dir_path = Path(r'C:\Users\山海摸鱼人\Documents')
if dir_path.is_dir():
    print(f"路径 {dir_path} 是一个目录")
else:
    print(f"路径 {dir_path} 不是一个目录")

输出结果(假设目录存在)

路径 C:\Users\山海摸鱼人\Documents 是一个目录

遍历目录

在实际应用中,我们经常需要遍历一个目录及其子目录,就像之前学过的 os.walk 函数那样。pathlib 模块也提供了方便的方法来实现这一功能。

1、遍历目录下的所有文件和子目录

from pathlib import Path

dir_path = Path('.')
for entry in dir_path.iterdir():
    if entry.is_dir():
        print(f"子目录: {entry}")
    else:
        print(f"文件: {entry}")

输出结果(假设当前目录有子目录 sub_dir 和文件 test.txt)

子目录:.\\sub_dir
文件:.\\test.txt

2、递归遍历目录

我们可以使用 rglob 方法来递归地遍历目录及其所有子目录,查找匹配特定模式的文件。

from pathlib import Path

# 查找当前目录及其子目录下所有的txt文件
for txt_file in Path('.').rglob('*.txt'):
    print(f"找到的txt文件: {txt_file}")

输出结果(假设当前目录及其子目录有多个txt文件)

找到的txt文件:.\\test.txt
找到的txt文件:.\\sub_dir\\sub_test.txt

注意:pathlib 模块中 rglobglob 的区别:

glob 方法适合在当前目录级别查找文件和目录,如果你只关心当前目录下的文件,不涉及子目录,使用 glob 是一个不错的选择。

rglob 方法则更强大,当你需要递归地搜索目录树,查找文件和目录时,使用 rglob 会非常方便,它可以遍历当前目录及其所有子目录,查找匹配模式的文件和目录。

应用案例

1、文件备份

将一个目录及其所有子目录下的文件备份到另一个目录。

from pathlib import Path
import shutil

source_dir = Path('moyu')
target_dir = Path('backup')

# 如果目标目录不存在,创建它
if not target_dir.exists():
    target_dir.mkdir()

# 遍历源目录及其子目录
for file in source_dir.rglob('*'):
    if file.is_file():
        relative_path = file.relative_to(source_dir)
        target_path = target_dir / relative_path
        target_path.parent.mkdir(parents=True, exist_ok=True)
        shutil.copy2(file, target_path)

print("备份完成")

2、统计目录大小

通过 pathlib 模块来统计一个目录及其所有子目录下文件的总大小。

from pathlib import Path

dir_path = Path('./Pictures')
total_size = 0

for file in dir_path.rglob('*'):
    if file.is_file():
        total_size += file.stat().st_size

print(f"目录总大小: {total_size} 字节")
print(dir_path.absolute())

了解了如何创建 Path 对象,获取路径的属性,进行路径操作,以及遍历目录等。pathlib 模块为我们处理文件路径提供了一种更加优雅和面向对象的方式,相比传统的 os 模块中的路径操作函数,它能让代码更加易读和维护。

山海摸鱼人
致力于记录美好之瞬间,追寻美好之明天。
 最新文章