Python如何在多压缩文件夹的.csv文件中搜索字符串并复制匹配压缩包
Python 批量压缩包检索匹配脚本
以下代码直接整合了你两段代码的功能,不需要提前手动解压所有压缩包,直接在内存中读取压缩包内CSV文件完成检测,对初学者友好,全部使用Python标准库,无需额外安装依赖:
import os import zipfile import shutil # -------------------------- 请修改以下参数 -------------------------- # 存放所有待检测zip压缩包的文件夹路径 source_zip_dir = "./your_source_zip_folder" # 匹配成功的压缩包要保存到的目标文件夹路径 target_save_dir = "./matched_zips" # 要搜索的目标字符串 search_str = "PROGRAM" # ------------------------------------------------------------------- # 自动创建目标文件夹如果不存在 os.makedirs(target_save_dir, exist_ok=True) # 遍历源目录下所有文件 for filename in os.listdir(source_zip_dir): # 只处理zip格式压缩包 if not filename.lower().endswith(".zip"): continue zip_path = os.path.join(source_zip_dir, filename) print(f"正在检测压缩包:{filename}") is_matched = False try: # 打开压缩包(对应第一段代码的逻辑) with zipfile.ZipFile(zip_path, 'r') as zf: # 遍历压缩包内所有文件 for file_info in zf.infolist(): # 只处理后缀为.csv的文件 if not file_info.filename.lower().endswith(".csv"): continue # 读取压缩包内csv文件内容,不需要解压到本地 with zf.open(file_info, 'r') as csv_f: # 逐行读取检测字符串(对应第二段代码的逻辑) line_num = 1 for line in csv_f: # 处理编码兼容问题,忽略无法解码的字符 try: line_str = line.decode('utf-8') except: line_str = line.decode('gbk', errors='ignore') if search_str in line_str: print(f"匹配成功:压缩包[{filename}] 内的CSV文件[{file_info.filename}] 第{line_num}行找到目标字符串") is_matched = True # 找到就跳出,不需要继续读当前文件剩余内容 break line_num += 1 # 只要有一个csv匹配成功,就跳出压缩包内文件遍历,节省时间 if is_matched: break except Exception as e: print(f"压缩包{filename}处理失败,错误信息:{str(e)},跳过该文件") continue # 如果匹配成功,就把整个压缩包复制到目标文件夹 if is_matched: target_path = os.path.join(target_save_dir, filename) # 避免目标文件夹有重名文件覆盖,也可以自己修改重命名逻辑 if os.path.exists(target_path): print(f"目标文件夹已存在同名文件{filename},跳过复制") else: shutil.copy2(zip_path, target_path) print(f"已将匹配成功的压缩包{filename}复制到目标文件夹") print("所有压缩包检测完成")
使用说明
- 先修改代码上方的三个参数:
source_zip_dir:替换成你存放所有待检测zip压缩包的文件夹路径,Windows路径可以写成r"C:\Users\xxx\zip_folder"避免反斜杠转义问题target_save_dir:替换成你要保存匹配成功压缩包的文件夹路径search_str:替换成你要搜索的目标字符串
- 直接运行脚本即可,运行过程中会打印处理进度和匹配结果
优化点说明
相比把压缩包全部解压后再检索的方案,该实现有两个优势:
- 不需要占用额外磁盘空间存放解压后的文件
- 只要找到匹配的内容就立即终止当前压缩包的检测,执行效率更高
内容的提问来源于stack exchange,提问作者user17557540
相关产品推荐
相关产品推荐

