Python实现遍历Zip文件,检查内部指定HTML字符串并移动文件
批量检查Zip文件并移动符合条件的文件
问题分析
需要遍历指定文件夹下的所有Zip文件,检查每个Zip中是否存在末尾为bb.html的HTML文件,若该文件包含指定字节串(比如b'Health'),则将整个Zip文件移动到目标文件夹。
现有代码的问题
你的最终代码存在以下几个问题:
- 缺少
shutil模块的导入(用于文件移动/复制) - 语法错误:
if b'Health in file:未闭合字符串引号 - 函数依赖全局变量,代码耦合度高,不利于维护
- 未处理Zip文件中不存在
bb.html的情况,会触发异常 - 重复创建
ZipFile对象,造成资源浪费
修正后的完整代码
import os import zipfile import shutil # 配置文件夹路径 SOURCE_FOLDER = r'J:/server/zippedMessages' # 存放待检查Zip的文件夹 DEST_FOLDER = r'L:/_Mine/Zipped Messages Moved' # 存放符合条件Zip的目标文件夹 TARGET_HTML_SUFFIX = 'bb.html' # 要检查的HTML文件后缀 SEARCH_STRING = b'Health' # 要查找的字节串(zip.read返回字节流,需用字节串匹配) def check_and_move_zip(zip_path): """检查单个Zip文件,符合条件则移动""" try: with zipfile.ZipFile(zip_path, 'r') as zip_ref: # 筛选Zip内所有以TARGET_HTML_SUFFIX结尾的文件 target_files = [f for f in zip_ref.namelist() if f.endswith(TARGET_HTML_SUFFIX)] if not target_files: print(f"[{os.path.basename(zip_path)}] 未找到以{TARGET_HTML_SUFFIX}结尾的文件") return # 检查每个目标文件是否包含指定字符串 for file_name in target_files: file_content = zip_ref.read(file_name) if SEARCH_STRING in file_content: # 移动文件到目标文件夹 shutil.move(zip_path, os.path.join(DEST_FOLDER, os.path.basename(zip_path))) print(f"[{os.path.basename(zip_path)}] 找到指定字符串,已移动") return # 找到一个符合条件就停止检查,直接移动 print(f"[{os.path.basename(zip_path)}] 未找到指定字符串") except Exception as e: print(f"[{os.path.basename(zip_path)}] 处理出错: {str(e)}") def main(): # 确保目标文件夹存在,不存在则自动创建 if not os.path.exists(DEST_FOLDER): os.makedirs(DEST_FOLDER) # 遍历源文件夹中的所有内容 for filename in os.listdir(SOURCE_FOLDER): file_path = os.path.join(SOURCE_FOLDER, filename) # 只处理后缀为.zip的文件(排除子文件夹) if os.path.isfile(file_path) and filename.endswith('.zip'): check_and_move_zip(file_path) if __name__ == "__main__": main()
关键代码说明
- 路径配置:用大写常量定义路径,
r前缀避免转义字符干扰,后续修改更方便 check_and_move_zip函数:- 用
with语句管理ZipFile对象,自动关闭文件,避免资源泄漏 - 通过
zip_ref.namelist()获取Zip内所有文件,筛选出目标HTML文件 - 捕获异常,保证单个文件处理失败时,程序能继续处理其他文件
- 用
shutil.move实现文件移动(需要复制的话换成shutil.copy即可)
- 用
main函数:- 先检查目标文件夹是否存在,不存在则创建,避免移动时出错
- 遍历源文件夹,只处理
.zip后缀的文件,自动跳过子文件夹
使用提示
- 把
SOURCE_FOLDER、DEST_FOLDER改成你的实际路径 - 按需调整
TARGET_HTML_SUFFIX(如果是精确匹配bb.html,可以把筛选条件改成f == 'bb.html')和SEARCH_STRING - 直接运行代码即可批量处理所有Zip文件
内容的提问来源于stack exchange,提问作者Stephanie
相关产品推荐
相关产品推荐

