当前位置:首页 > Python > 正文

Python glob库完全指南:高效文件路径匹配教程 | Python文件操作技巧

Python glob库完全指南

掌握文件路径匹配技巧,轻松处理复杂文件操作

什么是glob库?

Python的glob模块用于查找符合特定规则的文件路径名。它使用Unix shell风格的通配符进行文件匹配,让你可以轻松地搜索、筛选和操作文件系统中的文件。

与手动遍历目录相比,glob提供了一种更简洁、更高效的方式来处理文件路径匹配问题,特别适合需要批量处理文件的场景。

为什么使用glob库?

  • 简洁的语法:使用通配符(*, ?等)简化文件匹配
  • 跨平台兼容:在Windows、macOS和Linux上表现一致
  • 高效便捷:一行代码完成复杂的文件搜索
  • 与os模块无缝集成:返回结果可直接用于文件操作
  • 支持递归搜索:轻松查找嵌套目录中的文件

glob通配符详解

通配符 功能 示例 匹配结果
* 匹配任意数量的字符 *.txt 所有.txt文件
? 匹配单个字符 image?.jpg image1.jpg, imageA.jpg等
[] 匹配指定范围内的字符 report[0-9].docx report0.docx到report9.docx
** 递归匹配所有子目录(需recursive=True) **/*.py 当前目录及子目录中的所有.py文件

glob核心函数

1. glob.glob()

返回匹配指定模式的所有文件路径列表。

import glob

# 查找当前目录中所有.txt文件
txt_files = glob.glob('*.txt')
print(txt_files)

# 查找子目录中的图片文件
image_files = glob.glob('images/*.png')
print(image_files)

2. glob.iglob()

返回一个迭代器,逐个生成匹配的文件路径,适合处理大量文件。

import glob

# 使用迭代器处理大量文件
for file_path in glob.iglob('**/*.log', recursive=True):
    print(f"正在处理: {file_path}")
    # 执行文件操作...

3. 递归搜索(recursive=True)

使用**通配符和recursive参数进行递归目录搜索。

import glob

# 递归查找所有子目录中的.py文件
all_py_files = glob.glob('**/*.py', recursive=True)
print(f"找到{len(all_py_files)}个Python文件")

# 查找特定目录结构中的文件
config_files = glob.glob('project/**/config/*.ini', recursive=True)

实际应用示例

批量重命名文件

import glob
import os

# 将所有临时文件从.tmp重命名为.bak
for tmp_file in glob.glob('*.tmp'):
    new_name = os.path.splitext(tmp_file)[0] + '.bak'
    os.rename(tmp_file, new_name)
    print(f"重命名: {tmp_file} -> {new_name}")

合并多个CSV文件

import glob
import pandas as pd

# 找到所有2023年的CSV文件
csv_files = glob.glob('sales_data/sales_2023*.csv')

# 合并所有CSV文件
combined_csv = pd.concat([pd.read_csv(f) for f in csv_files])
combined_csv.to_csv("combined_sales_2023.csv", index=False)
print(f"合并了{len(csv_files)}个文件")

清理旧日志文件

import glob
import os
from datetime import datetime, timedelta

# 查找超过30天的日志文件
cutoff_date = datetime.now() - timedelta(days=30)
for log_file in glob.glob('logs/**/*.log', recursive=True):
    mod_time = datetime.fromtimestamp(os.path.getmtime(log_file))
    if mod_time < cutoff_date:
        os.remove(log_file)
        print(f"删除旧日志: {log_file}")

glob使用注意事项

  • 路径分隔符:Windows使用反斜杠(\),而glob使用正斜杠(/)作为路径分隔符
  • 大小写敏感:Unix系统区分大小写,Windows不区分
  • 隐藏文件:glob默认不匹配以点(.)开头的隐藏文件
  • 性能考虑:递归搜索大量文件时,考虑使用iglob避免内存问题
  • 模式顺序:glob不保证返回的文件路径顺序,需要时自行排序
  • 符号链接:默认情况下会跟随符号链接,可以使用glob.glob(..., include_hidden=False)控制

glob vs os.listdir

虽然os.listdir()也可以列出目录内容,但glob提供了更强大的模式匹配功能:

特性 glob os.listdir
通配符支持 ✓ 支持 ✗ 不支持
递归搜索 ✓ 支持 ✗ 不支持
返回完整路径 ✓ 默认 ✗ 仅文件名
结果过滤 ✓ 模式匹配 ✗ 需额外代码

开始使用glob优化你的文件操作吧!

无论是简单的文件查找还是复杂的批量处理,glob都能让你的代码更简洁高效。

发表评论