Linux下Python调用unzip命令确保提取指定TXT文件的方法
解决Python调用unzip时TXT文件未提取的问题
一、优化unzip命令参数
先调整unzip命令,明确指定提取文件类型并开启详细输出,避免静默跳过问题:
unzip -o -v '{dir}ATTOM_RECORDER/*.zip' '*.txt' '*.rpt' -d {dir}ATTOM_RECORDER/
参数说明:
-o:强制覆盖已存在文件,防止因文件已存在而跳过提取-v:输出详细提取日志,方便排查漏提原因'*.txt' '*.rpt':明确限定提取的文件类型,避免unzip误判或遗漏
二、添加Python端的提取验证逻辑
执行unzip命令后,必须先完成两步验证,再执行后续操作:
- 检查unzip命令的返回码,确保命令执行无异常
- 遍历目标目录,确认所有预期的TXT文件都已生成
示例代码:
import os import subprocess # 替换为你的实际目录路径 target_root = "/path/to/your/dir/" zip_folder = os.path.join(target_root, "ATTOM_RECORDER") extract_dir = zip_folder # 构造优化后的unzip命令 unzip_cmd = [ "unzip", "-o", "-v", os.path.join(zip_folder, "*.zip"), "*.txt", "*.rpt", "-d", extract_dir ] # 执行命令并捕获输出 run_result = subprocess.run(unzip_cmd, capture_output=True, text=True) # 验证命令执行状态 if run_result.returncode != 0: print(f"unzip执行失败:{run_result.stderr}") # 可添加重试、终止流程等逻辑 exit(1) # 验证所有TXT文件是否存在 missing_files = [] for item in os.listdir(zip_folder): if item.endswith(".zip"): # 假设压缩包内的TXT与压缩包同名,根据实际结构调整 expected_txt = os.path.splitext(item)[0] + ".txt" txt_full_path = os.path.join(extract_dir, expected_txt) if not os.path.exists(txt_full_path): missing_files.append(expected_txt) if missing_files: print(f"未提取到的TXT文件:{', '.join(missing_files)}") # 可添加重新提取、告警等逻辑 exit(1) # 验证通过,执行后续操作 print("所有TXT文件提取完成,启动后续流程...") # 你的后续业务代码
三、额外排查方向
- 压缩包完整性检查:用
unzip -t {zip_file_path}验证压缩包是否损坏,损坏的包会导致文件漏提 - 压缩包内路径结构:如果TXT文件在压缩包的子目录中,可添加
-j参数(unzip -j ...)忽略目录结构,直接提取到目标目录;或者调整验证逻辑,遍历子目录查找TXT - 路径合法性:确保
{dir}是绝对路径,避免Python工作目录变化导致的路径解析错误
内容的提问来源于stack exchange,提问作者arcee123
相关产品推荐
相关产品推荐

