从AWS S3下载ZIP解压时如何避免生成临时文件或过滤有效文件
问题解答
1、解压时是否可以避免生成临时无用文件
可以。你当前使用的extractall()会将压缩包内所有内容全量解压,包括macOS系统打zip包时自动带入的元数据目录、隐藏文件。只要将全量解压逻辑替换为仅提取目标有效文件,就能完全避免生成无用临时文件。
你看到的__MACOSX前缀、._前缀的文件均为macOS生成的资源派生元数据,和解压操作本身无关。
2、有效文件过滤方法
可以通过以下规则快速过滤出有效文件,同时也可以直接在解压环节就做过滤,从根源避免无用文件落盘:
- 排除所有路径前缀为
__MACOSX/的条目 - 排除路径中包含
/._的隐藏元数据文件 - 排除末尾为
/的目录条目 - 取路径最后一段的文件名,匹配你需要的
DockBooking、LoadEquipment等目标文件即可
参考代码如下:
import boto3 import zipfile import os s3 = boto3.client('s3') s3.download_file('testunzipping','DataPump_10000838.zip','/tmp/DataPump_10000838.zip') valid_files = [] # 可根据实际需求扩展目标文件名列表 target_names = {"DockBooking", "LoadEquipment"} with zipfile.ZipFile('/tmp/DataPump_10000838.zip', 'r') as zip_ref: for item in zip_ref.namelist(): # 过滤无用条目 if item.startswith('__MACOSX/') or '/._' in item or item.endswith('/'): continue # 提取路径最后一段的文件名 file_name = os.path.basename(item) if file_name in target_names: valid_files.append(item) # 仅解压有效文件,避免生成垃圾文件 zip_ref.extract(item, '/tmp/')
执行后valid_files中仅会保留你需要的有效文件路径。
3、生成指定格式gzip包的实现方式
不需要自己实现compress函数,直接使用Python标准库自带的gzip模块即可完成需求,参考代码如下:
import gzip import time # 生成秒级unix时间戳 epoch_ts = int(time.time()) for file_path in valid_files: base_name = os.path.basename(file_path) # 拼接要求格式的输出文件名:$item_$unixepochtimestamp.csv.gz output_name = f"{base_name}_{epoch_ts}.csv.gz" output_path = f"/tmp/{output_name}" # 读取原文件内容写入gzip压缩包 with open(f"/tmp/{file_path}", 'rb') as f_in, gzip.open(output_path, 'wb') as f_out: f_out.writelines(f_in)
如果需要调整压缩等级,可以在gzip.open时传入compresslevel参数,取值范围1-9,数值越高压缩比越高、压缩速度越慢,默认值为9。
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

