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

如何使用Python解压大型zip文件并过滤内容后再存入内存

大体积ZIP压缩文件流式过滤实现方案

核心实现逻辑

你给出的参考代码里用到的extractall会把所有文件解压到磁盘,完全不符合大文件处理的需求,我们直接跳过解压到磁盘的步骤,流式读取压缩包内的文件内容即可:

  • 直接使用ZipFile.open()打开压缩包内的目标文件,不需要完整解压到本地
  • 对结构化表格文件(如tsv/csv)使用分块读取能力,逐块过滤、筛选需要的列,全程不会加载全量文件到内存
  • 仅保留符合过滤条件的结果到内存,不会生成完整的解压文件,无需额外做文件删除操作

可直接复用的实现代码

import zipfile
import pandas as pd

def filter_large_zip(zip_file_path: str, 
                     inner_file_name: str,
                     filter_expr: str = "year > 2010",
                     usecols: list = None,
                     chunksize: int = 10000) -> pd.DataFrame:
    """
    从大体积zip压缩包中流式读取指定文件并过滤,仅返回符合条件的结果
    :param zip_file_path: 输入zip压缩包的本地路径
    :param inner_file_name: 压缩包内需要处理的文件名(如species.tsv)
    :param filter_expr: pandas支持的过滤表达式,示例为year>2010
    :param usecols: 需要保留的列名列表,示例为["col1", "col2", "col3"]
    :param chunksize: 单次读取的行数,可根据内存大小调整,数值越大读取速度越快
    :return: 过滤后的结果DataFrame
    """
    # 初始化结果列表,暂存每块的过滤结果
    result_chunks = []
    
    with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
        # 直接打开压缩包内的文件,流式读取
        with zip_ref.open(inner_file_name, "r") as inner_file:
            # 分块读取tsv文件,可根据实际文件格式换成read_csv等方法
            for chunk in pd.read_csv(inner_file, sep="\t", chunksize=chunksize, usecols=usecols):
                # 按条件过滤当前块的内容
                filtered_chunk = chunk.query(filter_expr)
                if not filtered_chunk.empty:
                    result_chunks.append(filtered_chunk)
    
    # 合并所有块的结果,返回最终过滤后的数据集
    return pd.concat(result_chunks, ignore_index=True)

# 调用示例
if __name__ == "__main__":
    filtered_data = filter_large_zip(
        zip_file_path="species.zip",
        inner_file_name="species.tsv",
        filter_expr="year > 2010",
        usecols=["col1", "col2", "col3"]
    )
    # 后续直接使用filtered_data即可,内存中仅保留过滤后的结果
    print(filtered_data.head())

注意事项

  • 如果你的文件不是tsv格式,修改pd.read_csv的sep参数即可,csv格式传,, 空格分隔传\s+
  • 内存如果足够大,可以调大chunksize参数到10万甚至更高,提升读取效率
  • 如果过滤条件比较复杂,也可以把filter_expr换成自定义函数,把代码里的chunk.query(filter_expr)改成自定义过滤逻辑即可

内容的提问来源于stack exchange,提问作者Stackbeans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 20:24:01