python 文件路径_「按需学Python」 1. Glob库遍历路径/文件

本文介绍如何利用Python的Glob库来批量处理老照片,包括筛选、重命名等操作,并对比了glob与iglob的不同之处。

小前言:

本人Python小白,因为最近想整理下近10几年的老照片,然后就有了写脚本批处理的想法。初始需求其实很简单,就是筛选自己想要的照片到指定文件夹,然后按照exif信息重命名照片为拍摄时间_拍摄设备.jpg,比如20180101_122334_E-M10.jpg代表的是2018年01月01日12点23分34秒用E-M10拍的照片。

这个算不上教程,不会全面地介绍某个库,只是我在折腾过程中的小摘要小想法,
如有错误请指出,如有疑问当然也欢迎留言相互讨论。


Glob库

这里从Glob库出发,遍历指定文件夹中jpg文件。Python官方文献:https://docs.python.org/3/library/glob.html

以py文件同目录下sample文件夹为例:
sample下有子文件夹sampleBackup, 3个jpg文件和1个txt文件;
sampleBackup含有2个jpg文件,如下图

ce6bbcc50697f00e62e5bdf09ec957d9.png

sample文件夹结构

glob

glob.glob(pathname, *, recursive=False)

最简单的glob使用方法,遍历.sample路径下的所有jpg文件glob默认下是不会遍历子文件夹,recursive=False可省略

import globfor filepath in glob.glob(r".sample*.jpg"):    print(filepath)

运行结果:

.sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg

glob.glob(pathname, *, recursive=True)

如果需要一并查找n级目录下文件,则需要扩展路径,
这里以二级目录sampleBackup为例:

import globfor filepath in glob.glob(r".sample***.jpg", recursive = True):    print(filepath)

运行结果:

.sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg.samplesampleBackupP7200248-2.jpg.samplesampleBackupP7200258-2.jpg

iglob

iglob用法和glob相似,如果使用按照以上两个例子使用,输出结果是相同的。

import globprint("glob:")for filepath in glob.glob(r".sample*.jpg"):    print(filepath)print("-----------------------------------------------------------------")for filepath in glob.glob(r".sample***.jpg", recursive = True):    print(filepath)print("=================================================================")print("iglob:")for filepath in glob.iglob(r".sample*.jpg"):    print(filepath)print("-----------------------------------------------------------------")for filepath in glob.iglob(r".sample***.jpg", recursive = True):    print(filepath)print("=================================================================")

运行结果:

glob:.sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg-----------------------------------------------------------------.sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg.samplesampleBackupP7200248-2.jpg.samplesampleBackupP7200258-2.jpg=================================================================iglob:.sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg-----------------------------------------------------------------.sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg.samplesampleBackupP7200248-2.jpg.samplesampleBackupP7200258-2.jpg=================================================================

iglob和glob的区别

glob把遍历到的结果存储到一个list里,而iglob则是一个generator object

print("glob:")globContent = glob.glob(r".sample*.jpg")print(type(globContent), globContent)for content in globContent:    print(content)print("=================================================================")print("iglob:")iglobContent = glob.iglob(r".sample*.jpg")print(type(iglobContent), iglobContent)for content in iglobContent:    print(content)print("=================================================================")

运行结果:

glob: ['.sampleP1020523.jpg', '.sampleP7200248-2.jpg', '.sampleP7200258-2.jpg'].sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg=================================================================iglob:.sampleP1020523.jpg.sampleP7200248-2.jpg.sampleP7200258-2.jpg=================================================================
<think>嗯,用户现在问的是如何遍历文件夹下命名为xxx_0.txt、xxx_1.txt、xxx_2.txt这样的文件。之前他们问过关于Python中如何写指定范围的循环,现在这个问题似乎更具体,涉及到文件遍历和模式匹配。我要先回想一下Python中处理文件和目录的常用模块,比如os和glob。 用户之前的提问是关于循环范围的,所以他们可能对循环结构比较熟悉,现在要结合文件操作。首先,得确定他们要的是遍历特定模式的文件,比如以数字结尾的txt文件。可能的解决方案包括使用glob模块的通配符匹配,或者os.listdir配合条件判断,或者更高级的正则表达式。 考虑到glob模块比较简单,适合文件名模式匹配,而os.listdir可能要自己写过滤逻辑。另外,用户可能希望文件名的格式是“xxx_数字.txt”,其中数字是连续的,比如从0开始递增。或者可能只是要匹配任何带有下划线和数字的txt文件要确认用户的具体求:是否文件名中的“xxx”是固定前缀,还是任意字符?比如,他们可能要匹配类似“file_0.txt”、“data_1.txt”这样的文件,其中“xxx”代表任意前缀,后面跟着下划线和数字。或者是否前缀是固定的,比如所有文件都以“xxx”开头? 根据用户给出的例“xxx_0.txt”,这里的“xxx”可能是一个占位符,代表任意前缀,所以应该使用通配符来匹配任意前缀,后面跟着下划线、数字和.txt扩展名。这时候,glob.glob的模式应该是“*_[0-9].txt”或者更精确地匹配数字部分。但要注意,数字可能不止一位,比如“file_10.txt”这样的文件名,所以应该使用“*_[0-9]*.txt”或者更准确的模式。 另外,可能要使用正则表达式来精确匹配,比如使用re模块,检查文件名是否符合某种模式。这可能更灵活,但代码稍微复杂一些。要根据用户的求推荐不同的方法。 还要考虑文件遍历的范围,是当前目录还是指定目录?用户可能遍历特定文件夹,所以应该在代码中允许指定路径。同时,可能要递归遍历目录,但用户的问题中没有提到这一点,所以可能只要当前层级的文件。 在之前的回复中,用户可能已经了解基本的循环结构,所以这次的重点是文件遍历和模式匹配。要分步骤讲解,先介绍glob的方法,再介绍os.listdir加正则的方法,或者反之。同时,提醒用户注意文件名的大小写,以及路径的处理,比如使用os.path.join来拼接路径。 可能还要提到排序问题,比如文件遍历的顺序是否是按照数字顺序来的,因为默认情况下,文件名的排序可能不是按数字大小,而是按字符串字典序。例如,“xxx_10.txt”会排在“xxx_2.txt”前面,这时候如果要按数字顺序处理,可能要提取数字部分进行排序。 另外,用户可能在处理一系列按数字编号的文件要按顺序处理它们,所以排序部分可能很重要。在示例代码中,可以加入排序的部分,比如使用sorted函数配合自定义的键来提取数字。 还要考虑跨平台的问题,比如路径分隔符,但使用os模块和glob模块通常会自动处理这些问题,所以代码在Windows和Linux上都能运行。 最后,总结不同方法的优缺点,比如glob简单快捷,正则表达式更灵活,但要更多代码。根据用户的具体求推荐合适的方法。同时,提醒用户注意异常处理,比如目录不存在的情况,或者权限问题,但可能用户暂时不要这些高级内容,保持回答简洁。 综上,回答应该包括以下几个部分: 1. 使用glob模块的通配符匹配。 2. 使用os.listdir配合正则表达式过滤。 3. 文件排序的方法(如果要按数字顺序)。 4. 示例代码和解释。 5. 注意事项,如路径处理、大小写、排序问题等。</think>在 Python遍历指定命名模式的文件(如 `xxx_0.txt`, `xxx_1.txt`),可以通过 **通配符匹配** 或 **正则表达式** 实现。以下是具体方法及代码示例: --- ### **一、使用 `glob` 模块(推荐)** `glob` 模块支持通配符 `*` 和 `?`,直接匹配文件名: ```python import glob # 匹配所有以 "_数字.txt" 结尾的文件(如 file_0.txt, data_1.txt) files = glob.glob("./*_[0-9].txt") # 当前目录下 # 或指定路径glob.glob("/path/to/folder/*_[0-9].txt") for file_path in files: print(f"找到文件: {file_path}") ``` #### **通配符说明** - `*_[0-9].txt`: 匹配 `任意前缀_单个数字.txt`(如 `xxx_0.txt`) - `*_[0-9]*.txt`: 匹配 `任意前缀_数字任意位数.txt`(如 `xxx_123.txt`) --- ### **二、使用 `os.listdir` + 正则表达式** 更精确匹配时可用正则表达式筛选文件名: ```python import os import re folder = "./your_folder" pattern = re.compile(r"^.*_\d+\.txt$") # 匹配 xxx_数字.txt for filename in os.listdir(folder): if pattern.match(filename): file_path = os.path.join(folder, filename) print(f"匹配到文件: {file_path}") ``` #### **正则表达式解释** - `^.*`: 任意前缀(如 `xxx`) - `_\d+`: 下划线后跟至少一个数字(如 `_0`, `_42`) - `\.txt$`: 以 `.txt` 结尾 --- ### **三、按数字顺序遍历文件** 若文件名中的数字顺序处理(如 `file_0.txt` → `file_1.txt`),提取数字并排序: ```python import glob import re files = glob.glob("./*_[0-9].txt") # 提取文件名中的数字并排序(例如:xxx_3.txt → 3) files_sorted = sorted(files, key=lambda x: int(re.search(r"_(\d+)\.txt$", x).group(1))) for file_path in files_sorted: print(f"按顺序处理: {file_path}") ``` --- ### **四、常见问题解决** #### 1. **匹配多级目录文件** 使用 `glob.glob("**/*_[0-9].txt", recursive=True)` 递归搜索目录。 #### 2. **大小写敏感问题** 统一转小写后匹配: ```python filename_lower = filename.lower() if re.match(r".*_\d+\.txt", filename_lower): # 处理文件 ``` #### 3. **处理文件路径** 使用 `os.path` 确保跨平台兼容性: ```python import os file_path = os.path.join(folder, filename) # 自动处理路径分隔符 ``` --- ### **方法对比** | **方法** | **优点** | **缺点** | |-----------------------|-----------------------------|-----------------------------| | `glob` 模块 | 代码简洁,支持通配符 | 复杂模式多次调整通配符 | | `os.listdir` + 正则 | 匹配更灵活,可自定义规则 | 手动处理正则表达式逻辑 | --- ### **完整示例代码** ```python import glob # 匹配所有 xxx_数字.txt 文件并按数字排序 files = sorted( glob.glob("./*_[0-9]*.txt"), key=lambda x: int(re.search(r"_(\d+)\.", x).group(1)) ) for file in files: print(f"处理文件: {file}") # 在此处添加文件操作代码(如读取、修改) ``` 根据求选择方法,若文件名格式更复杂,可进一步调整正则表达式!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值