如何在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
相关产品推荐
相关产品推荐

