【发布时间】:2021-03-09 06:16:20
【问题描述】:
import boto3
import os
client = boto3.client('connect')
s3 = boto3.resource(
service_name='s3',
region_name='us-west-2',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key
)
for my_bucket_object in s3.Bucket("my_bucket").objects.filter(Prefix="user/folder/"):
s3.Object(my_bucket_object.bucket_name, my_bucket_object.key).download_file(f'./aws/{my_bucket_object.key}')
- 无需迭代,但代码类似,我可以成功下载单个文件。
- 不下载,打印桶键显示正常输出
但是,当我遍历多个文件并将密钥用作 download_file 的输入时,我收到以下错误消息。目标键的名称似乎正在更改?
FileNotFoundError: [Errno 2] 没有这样的文件或目录: './aws/user/folder\.7g4DBa9A'
我有以下两个问题:
- 如何防止这种情况发生并下载文件?
- 有没有办法将文件名与“子目录”分开(我意识到 AWS 不使用这些,但键包含仅由“/”分隔的目录/类似文件的名称,我想将它们分开以保存)
================================================ =============================
感谢 Marcin 的评论,找到了答案。
反复打印所有输出后,似乎第一个是“文件夹”,下载时翻译成奇怪的名称。
即。
用户/文件夹/
用户/文件夹/文件1
用户/文件夹/文件2
等等
因此,忽略第一次迭代就能解决它。
for obj in my_bucket.objects.filter(Prefix=prefix):
output_file = obj.key.split('/')[-1]
if output_file == "":
continue
else:
s3.Object(bucket_name=my_bucket.name, key=my_bucket_object.key).download_file(arbitrary output path)
【问题讨论】:
标签: python amazon-web-services amazon-s3 boto3