You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:25:22