上传文件到Amazon S3时如何通过变量动态创建子层级文件夹存储文件
S3动态生成子文件夹路径上传解决方案
问题根因
- 直接写
year/month/day/fileName2触发报错是因为Python将/识别为除法运算符,字符串类型变量之间不能做除法运算,不属于S3 SDK的错误。 - 直接拼接变量没有生成层级是因为拼接时没有加入路径分隔符
/,所有字符连为整体被识别为单个文件名。
实现方法
S3本身没有物理文件夹结构,靠对象键(Key)中的/符号模拟层级,不需要提前创建文件夹,上传时只要把动态生成的带/的键传给SDK即可自动生成对应的目录结构。
推荐用f-string拼接路径,写法简洁易维护,适合循环场景动态生成路径:
s3_key = f"{year}/{month}/{day}/{fileName2}" bucket.upload_fileobj( io.BytesIO(gzipped_content), s3_key, ExtraArgs={"ContentType": "text/plain"})
注意事项
- 不要使用
os.path.join拼接S3路径,Windows环境下该方法会生成反斜杠\作为分隔符,S3无法识别为层级标记。 - 若使用Python3.6以下版本不支持f-string,可以改用format写法:
s3_key = "{}/{}/{}/{}".format(year, month, day, fileName2)
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

