【问题标题】:Download multiple files from specific "subdirectory", AWS S3 with boto3 & Python 3.7从特定的“子目录”下载多个文件,AWS S3 with boto3 & Python 3.7
【发布时间】: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}')
  1. 无需迭代,但代码类似,我可以成功下载单个文件。
  2. 不下载,打印桶键显示正常输出

但是,当我遍历多个文件并将密钥用作 download_file 的输入时,我收到以下错误消息。目标键的名称似乎正在更改?

FileNotFoundError: [Errno 2] 没有这样的文件或目录: './aws/user/folder\.7g4DBa9A'

我有以下两个问题:

  1. 如何防止这种情况发生并下载文件?
  2. 有没有办法将文件名与“子目录”分开(我意识到 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


    【解决方案1】:

    有没有办法将文件名与“子目录”分开

    您可以通过/ 拆分密钥并在您执行download_file 之前获取最后一个元素:

    output_file = my_bucket_object.key.split('/')[-1]
    s3.Object(my_bucket_object.bucket_name, my_bucket_object.key).download_file(f'./aws/output_file')
    

    【讨论】:

    • 谢谢!问题 2 是答案。不过,我仍然停留在问题 1 上(对于查看此线程的其他人)
    • @Shaner 你可以通过正确的保存路径来防止它,这是问题2。
    • 我通过您的第一条评论间接找到了答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2022-01-09
    • 2018-10-10
    相关资源
    最近更新 更多