将Parquet压缩文件上传至S3子目录的问题求助
问题分析与解决思路
核心问题是本地文件与S3目标路径的映射关系未正确绑定,大概率是代码中复用了同一个目标路径变量,或循环/变量赋值时未区分两个文件的上传目标。
具体修改方案
方案1:用字典明确映射本地路径与S3目标
通过字典建立本地文件夹和对应S3子目录的绑定关系,彻底避免变量混淆:
import boto3 import os # 初始化S3客户端 s3 = boto3.client('s3') bucket_name = 'your-bucket-name' # 替换为你的存储桶名称 # 定义本地路径与S3目标路径的映射表 file_mappings = [ { 'local_folder': 'Folder-A', 's3_prefix': 's4/dev/A Folder/' }, { 'local_folder': 'Folder-B', 's3_prefix': 's4/dev/x/b Folder/' } ] # 遍历映射表完成上传 for mapping in file_mappings: local_dir = mapping['local_folder'] s3_target = mapping['s3_prefix'] # 读取文件夹内的Parquet压缩文件(假设每个文件夹仅一个目标文件) for filename in os.listdir(local_dir): if filename.endswith('.Parquet.zip'): local_file = os.path.join(local_dir, filename) s3_file_key = s3_target + filename # 执行上传 s3.upload_file(local_file, bucket_name, s3_file_key) print(f"上传完成:{local_file} → s3://{bucket_name}/{s3_file_key}")
方案2:单独处理每个文件(适合文件数量少的场景)
如果仅两个文件,直接分开处理,从根源避免变量复用错误:
import boto3 import os s3 = boto3.client('s3') bucket_name = 'your-bucket-name' # 处理Folder-A的文件 local_a_dir = 'Folder-A' s3_a_target = 's4/dev/A Folder/' for filename in os.listdir(local_a_dir): if filename.endswith('.Parquet.zip'): s3.upload_file(os.path.join(local_a_dir, filename), bucket_name, s3_a_target + filename) # 处理Folder-B的文件 local_b_dir = 'Folder-B' s3_b_target = 's4/dev/x/b Folder/' for filename in os.listdir(local_b_dir): if filename.endswith('.Parquet.zip'): s3.upload_file(os.path.join(local_b_dir, filename), bucket_name, s3_b_target + filename)
排查要点
- 检查代码中S3目标路径变量是否被重复赋值,比如循环中未更新目标路径,导致第二次上传复用了第一次的路径。
- 确认遍历文件时,是否正确关联了对应的本地文件夹和S3路径,避免两个文件绑定到同一个S3前缀。
- 临时添加日志输出,打印每个文件的本地路径和目标S3路径,验证映射关系是否正确。
内容的提问来源于stack exchange,提问作者Madhu Reddy
相关产品推荐
相关产品推荐

