在实际工作中,经常需要面对几十、上百甚至上千个文件进行相同操作——比如给所有照片重命名、从几百个日志中提取特定字段、将多个Excel合并等。手动逐个处理效率极低且容易出错,本节介绍几种靠谱的批量处理方法。
5.4.1 先备份,再动手
这是铁律。 批量操作前务必将目标文件复制到单独的backup文件夹,或在代码中加入--dry-run(试运行)模式,先打印操作清单确认无误后再执行。
5.4.2 批量重命名与整理
场景: 相机导出的照片名为IMG_9481.jpg、IMG_9482.jpg,需要按日期重命名为2024-01-15_001.jpg。
Python方案:
import os
from datetime import datetime
folder = "./photos"
for idx, filename in enumerate(os.listdir(folder), 1):
if filename.endswith(".jpg"):
# 获取文件修改时间
mtime = os.path.getmtime(os.path.join(folder, filename))
date_str = datetime.fromtimestamp(mtime).strftime("%Y-%m-%d")
new_name = f"{date_str}_{idx:03d}.jpg"
os.rename(os.path.join(folder, filename), os.path.join(folder, new_name))
命令行方案(Bash):
# 批量添加前缀
for f in *.txt; do mv "$f" "backup_$f"; done
# 批量修改扩展名(.jpeg改为.jpg)
for f in *.jpeg; do mv "$f" "${f%.jpeg}.jpg"; done
5.4.3 批量内容处理
场景: 从100个日志文件中提取包含"ERROR"的行,合并到一个文件。
import glob
with open("errors_summary.txt", "w", encoding="utf-8") as outfile:
for logfile in glob.glob("logs/*.log"):
with open(logfile, "r", encoding="utf-8") as f:
for line in f:
if "ERROR" in line:
outfile.write(f"{logfile}: {line}")
实用技巧:用tqdm显示进度条
处理大量文件时,建议加装进度条避免误以为程序卡死:
from tqdm import tqdm
import glob
files = glob.glob("data/*.csv")
for file in tqdm(files, desc="处理中"):
# 处理逻辑...
pass
5.4.4 批量格式转换
场景: 将用户上传的几十张PNG图片统一压缩并转为JPG,减少服务器空间占用。
from PIL import Image
import os
input_folder = "./raw"
output_folder = "./compressed"
for filename in os.listdir(input_folder):
if filename.endswith(".png"):
img = Image.open(os.path.join(input_folder, filename))
# 转换为RGB(去除PNG透明通道)
rgb_img = img.convert('RGB')
# 压缩质量85%,平衡清晰度与体积
new_name = filename.replace(".png", ".jpg")
rgb_img.save(os.path.join(output_folder, new_name), "JPEG", quality=85, optimize=True)
5.4.5 并行加速(进阶)
当文件数量超过1000个或单个处理很耗时时,使用多线程提速:
from concurrent.futures import ThreadPoolExecutor
import os
def process_file(filename):
# 具体处理逻辑
pass
files = os.listdir("./data")
# 同时开4个线程处理
with ThreadPoolExecutor(max_workers=4) as executor:
executor.map(process_file, files)
5.4.6 避坑指南
- 文件名包含空格或特殊字符:在Bash脚本中始终用
"$f"(加引号)包裹变量,否则My Document.txt会被识别成两个文件。 - 编码问题:Windows下的中文文件在Linux处理时可能出现乱码,建议先用
chardet检测编码。 - 覆盖风险:重命名前检查目标文件名是否已存在,避免覆盖。
- 日志记录:批量操作后生成
operation_log.txt,记录哪些文件被修改,方便回滚。
小结: 对于一次性任务,命令行脚本最快;需要复杂逻辑(条件判断、数据解析)时,用Python更稳妥。无论哪种方式,牢记先测试单个文件,再批量执行。