如何用itertools遍历文件列表?批量提取文件奇数行方案咨询
嘿,你的单文件提取奇数行的代码已经很靠谱了!要扩展到批量处理100个同类文件的话,我们只需要加上文件批量遍历的逻辑就行,给你整理了完整的可落地方案:
批量提取多个文件的奇数行
核心思路
我们可以用Python的glob模块来批量匹配所有目标文件(比如所有.txt或.log文件),然后循环复用你原来的奇数行提取逻辑,每个输入文件对应生成一个独立的输出文件(避免内容覆盖)。
完整代码实现
import sys import itertools import glob # -------------------------- 配置区域 -------------------------- # 这里设置要匹配的文件模式,支持通配符 # 示例:当前目录所有txt文件 -> "*.txt" # 示例:data文件夹下所有log文件 -> "./data/*.log" # 示例:所有子目录的txt文件 -> "**/*.txt"(会自动开启递归匹配) FILE_PATTERN = "*.txt" # 输出文件的后缀,比如原文件test.txt -> test_odd.txt OUTPUT_SUFFIX = "_odd" # ------------------------------------------------------------- # 获取所有匹配的文件列表,自动判断是否需要递归子目录 input_files = glob.glob(FILE_PATTERN, recursive="**" in FILE_PATTERN) if not input_files: print("⚠️ 没有找到匹配的文件,请检查FILE_PATTERN是否正确") sys.exit(1) # 循环处理每个文件 for idx, filename in enumerate(input_files, 1): # 生成安全的输出文件名,处理带多个扩展名或无扩展名的文件 try: name_part, ext_part = filename.rsplit('.', 1) output_filename = f"{name_part}{OUTPUT_SUFFIX}.{ext_part}" except ValueError: # 处理无扩展名的文件,比如"README" -> "README_odd" output_filename = f"{filename}{OUTPUT_SUFFIX}" # 复用你原来的奇数行提取逻辑(内存友好,不会一次性加载所有行) with open(filename, 'r', encoding='utf-8') as f: # itertools.islice(迭代器, 起始索引, 结束, 步长):从第0行开始每2行取一次,对应原文件的奇数行(第1、3、5...行) odd_lines = itertools.islice(f, 0, None, 2) content = ''.join(odd_lines) # 写入输出文件(用'w'模式覆盖,若需要追加可改成'a+',但批量处理推荐覆盖) with open(output_filename, 'w', encoding='utf-8') as out_f: out_f.write(content) print(f"✅ 已处理 {idx}/{len(input_files)}: {filename} -> {output_filename}") print("\n🎉 所有文件处理完成!")
关键细节说明
- 灵活匹配文件:
- 用
*.txt匹配当前目录所有TXT文件; - 用
**/*.txt可以匹配所有子目录下的TXT文件; - 如果不想用通配符,也可以把
input_files改成sys.argv[1:],这样运行时手动传入多个文件名:python batch_odd.py file1.txt file2.txt ...
- 用
- 输出命名安全:用
rsplit('.',1)分割文件名和扩展名,避免像my.file.txt这种多扩展名文件出问题;还兼容了无扩展名的文件; - 内存友好:
itertools.islice不会一次性把整个文件加载到内存,适合处理超大文件; - 编码处理:加上
encoding='utf-8'避免不同编码的文件出现乱码问题(如果你的文件是GBK等其他编码,改成对应的编码即可)。
运行方式
- 把代码保存为
batch_odd_lines.py; - 修改
FILE_PATTERN为你的目标文件模式; - 在终端运行:
python batch_odd_lines.py; - 等待处理完成,每个输入文件都会生成带
_odd后缀的输出文件。
内容的提问来源于stack exchange,提问作者Izzat Z.
相关产品推荐
相关产品推荐

