如何在Python中使用shutil提取.000格式文件
解决Python提取.000格式文件的问题
你当前代码的问题
- 硬指定
tar格式解压.000文件是错误的,.000通常是分卷压缩文件,不属于tar格式 - 路径拼接用
f"{directory}\{file}"存在跨平台兼容性问题,应该用os.path.join - 内层循环复用了
file变量,会覆盖外层循环的变量值,导致逻辑错误 shutil.unpack_archive无法直接处理分卷格式的.000文件,需要针对性处理
.000文件的两种常见类型及处理方案
.000一般是分卷压缩文件,常见有两种情况,对应不同处理方式:
1. Split工具拆分的分卷文件
这类文件是通过split命令将单个大文件拆分成多个小分卷(比如xxx.000, xxx.001, xxx.002...),需要先合并所有分卷,再处理合并后的文件。
合并代码示例:
import os def merge_split_files(input_dir, output_path): # 按文件名排序分卷文件 split_files = sorted([f for f in os.listdir(input_dir) if f.endswith('.000') or f.startswith(os.path.basename(output_path).split('.')[0])]) with open(output_path, 'wb') as out_f: for f in split_files: file_path = os.path.join(input_dir, f) with open(file_path, 'rb') as in_f: out_f.write(in_f.read())
2. 7-Zip分卷压缩文件
如果是7-Zip生成的分卷(通常命名为xxx.7z.000,但也可能省略.7z直接用.000),可以使用py7zr库来直接解压,无需手动合并。
先安装依赖:
pip install py7zr
解压代码示例:
import py7zr def extract_7z_split(archive_path, output_dir): # 7-Zip分卷只需要指定第一个分卷(.000文件)即可自动识别所有分卷 os.makedirs(output_dir, exist_ok=True) with py7zr.SevenZipFile(archive_path, mode='r') as z: z.extractall(output_dir)
适配你场景的完整修改代码
结合你原本的需求(先解压zip,再处理.000文件),修改后的代码如下:
import os import shutil import py7zr def extract_zip(zip_path, output_dir): shutil.unpack_archive(zip_path, output_dir) def extract_7z_split(archive_path, output_dir): os.makedirs(output_dir, exist_ok=True) with py7zr.SevenZipFile(archive_path, mode='r') as z: z.extractall(output_dir) def process_files(root_dir): # 先处理所有zip文件 for file_name in os.listdir(root_dir): if file_name.endswith('.zip'): zip_path = os.path.join(root_dir, file_name) extract_zip(zip_path, root_dir) # 处理9050/9070开头的目录下的.000文件 target_dirs = [d for d in os.listdir(root_dir) if d.startswith('9050') or d.startswith('9070')] for dir_name in target_dirs: dir_path = os.path.join(root_dir, dir_name) if not os.path.isdir(dir_path): continue output_root = os.path.join(root_dir, 'TestExtract000') for file_name in os.listdir(dir_path): if file_name.endswith('.000'): archive_path = os.path.join(dir_path, file_name) # 按7-Zip分卷处理,如果是split拆分的,替换成merge_split_files逻辑 extract_7z_split(archive_path, output_root) if __name__ == "__main__": root_directory = os.path.join(os.getcwd(), "BDP Raw data") process_files(root_directory)
注意事项
- 如果你的.000是split拆分的,把
extract_7z_split替换成前面的merge_split_files函数即可 - 确保所有分卷文件都在同一个目录下,否则解压/合并会失败
- 处理大文件时,注意内存占用,合并split文件可以分块读取写入,避免内存溢出
内容的提问来源于stack exchange,提问作者Haru Ko-izumi
相关产品推荐
相关产品推荐

