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

如何在ADLS中用Python解压带密码的ZIP文件?(遇FileNotFoundError)

解决ADLS中带密码ZIP文件解压的FileNotFoundError问题

问题根源

zipfile模块仅支持本地文件系统路径,无法直接识别ADLS的abfss://协议路径。你直接传入"XYZ.zip"时,程序会在本地文件系统中查找该文件,自然找不到,从而触发FileNotFoundError。

解决步骤

需要先把ADLS中的ZIP文件读取到内存字节流中,再交给zipfile处理,具体操作如下:

1. 导入所需模块

结合你已能通过abfss读取CSV的环境,使用PySpark来读取ADLS文件,同时导入处理字节流和ZIP的模块:

from zipfile import ZipFile
from io import BytesIO
from pyspark.sql import SparkSession

2. 读取ADLS中的ZIP文件到内存

用Spark读取二进制格式的ZIP文件,提取出文件内容的字节数据:

# 初始化SparkSession(若环境未自动初始化则执行)
spark = SparkSession.builder.appName("UnzipADLSFile").getOrCreate()

# 替换为你的ZIP文件完整abfss路径
adls_zip_path = "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标文件夹/XYZ.zip"
binary_df = spark.read.format("binaryFile").load(adls_zip_path)

# 获取ZIP文件的字节内容
zip_content_bytes = binary_df.select("content").first()[0]

3. 解压带密码保护的ZIP文件

将内存中的字节流传入ZipFile,使用指定密码完成解压:

with ZipFile(BytesIO(zip_content_bytes), 'r') as zip_handler:
    zip_handler.printdir()
    print('开始解压所有文件...')
    zip_handler.extractall(pwd=b'123123$SADMK6%002#')
    print('解压完成!')

额外说明:将解压文件写回ADLS

如果需要把解压后的文件保存回ADLS,不能直接用extractall()(该方法会写入本地),需逐个读取ZIP内的文件内容,再写入ADLS:

with ZipFile(BytesIO(zip_content_bytes), 'r') as zip_handler:
    for file_item in zip_handler.infolist():
        with zip_handler.open(file_item, pwd=b'123123$SADMK6%002#') as file_stream:
            file_data = file_stream.read()
            # 替换为ADLS中的目标保存路径
            target_adls_path = f"abfss://<容器名>@<存储账户名>.dfs.core.windows.net/解压后文件夹/{file_item.filename}"
            spark.createDataFrame([(file_data,)], ["content"]).write.mode("overwrite").format("binaryFile").save(target_adls_path)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:12:39