如何通过预签名URL读取Amazon S3加密压缩包并提取CSV到DataFrame
基于S3预签名URL读取密码保护Zip内CSV到DataFrame的实现方案
完全可以通过预签名URL实现需求,无需存储桶名称、对象密钥、AWS访问凭证,也不需要提前知道压缩包内的CSV文件名,实现逻辑与代码如下:
核心实现代码
import requests import zipfile import io import pandas as pd # 替换为实际参数 PRE_SIGNED_URL = "<你的S3预签名URL>" ZIP_PASSWORD = b"<你的Zip压缩包密码>" # 密码需为bytes类型,也可写为"<密码>".encode("utf-8") # 拉取预签名URL对应的Zip文件内容 resp = requests.get(PRE_SIGNED_URL, stream=True) resp.raise_for_status() # 请求失败时自动抛出异常(如预签名过期、无访问权限等) # 内存中处理Zip文件,无需落盘 with io.BytesIO(resp.content) as tf: tf.seek(0) with zipfile.ZipFile(tf, mode='r') as zipf: # 自动遍历压缩包筛选CSV文件,无需提前知道文件名 csv_file_list = [file for file in zipf.namelist() if file.lower().endswith(".csv")] if not csv_file_list: raise ValueError("压缩包内未检测到CSV格式文件") # 取第一个匹配的CSV文件,多CSV场景可自行调整筛选逻辑 target_csv = csv_file_list[0] df = pd.read_csv( zipf.open(target_csv, pwd=ZIP_PASSWORD), sep="|" # 可根据实际CSV分隔符修改 ) # 后续可直接处理df对象 print(df.head())
注意事项
- 依赖安装:如果运行时提示缺少
requests库,执行命令pip install requests安装即可 - 预签名URL有效期:预签名URL生成时会设置有效时长,必须在有效期内发起请求才能正常获取资源
- 大文件适配:如果Zip文件体积过大,可调整
requests流式读取逻辑,分块加载内容避免内存占用过高 - 多CSV处理:如果压缩包内存在多个CSV文件,可根据文件名规则、文件大小等条件自定义筛选逻辑,也可批量读取后合并为同一个DataFrame
内容的提问来源于stack exchange,提问作者elliot
相关产品推荐
相关产品推荐

