【问题标题】:Amazon S3 boto3 how to iterate through objects in a bucket?Amazon S3 boto3 如何遍历存储桶中的对象?
【发布时间】:2020-07-07 10:24:48
【问题描述】:

在烧瓶应用程序中,我试图遍历 S3 存储桶中的对象并尝试打印密钥/文件名,但 my_bucket.objects.all() 仅返回存储桶中的第一个对象。它没有返回所有对象。输出是[001.pdf] 而不是[001, 002, 003, 004, 005]

from flask import Flask, jsonify, Response, request
from flask_cors import CORS, cross_origin
from config import S3_BUCKET, S3_ACCESS_KEY, S3_SECRET_ACCESS_KEY

import boto3
import csv
import re


s3 = boto3.client(
    's3',
    aws_access_key_id=S3_ACCESS_KEY,
    aws_secret_access_key=S3_SECRET_ACCESS_KEY
)

app = Flask(__name__)
CORS(app, supports_credentials=True)


@app.route('/')
def health():
    return jsonify({"message": "app is working"})


@app.route('/files')
def list_of_files():
    s3_resource = boto3.resource('s3')
    my_bucket = s3_resource.Bucket(S3_BUCKET)
    summaries = my_bucket.objects.all()
    files = []
    for file in summaries:
        # this prints the bucket object
        print("Object: {}".format(summaries))
        files.append(file.key)
        # file.key is supposed to return the names of the list of objects
        # print(file.key)
        return jsonify({"files":"{}".format(file.key)})




if __name__ == "__main__":
    app.run()

【问题讨论】:

  • 如果可以避免的话,不要向您的 Web 应用程序提供硬编码的 AWS 凭证。如果在 AWS 中运行,则利用 IAM 角色。

标签: python amazon-web-services flask amazon-s3 boto3


【解决方案1】:

您因返回太早而退出循环。

def list_of_files():
    s3_resource = boto3.resource('s3')
    my_bucket = s3_resource.Bucket(S3_BUCKET)
    summaries = my_bucket.objects.all()
    files = []
    for file in summaries:
        files.append(file.key)
    return jsonify({"files": files})

【讨论】:

  • 现在这是一个愚蠢的问题,我在想,我做错了什么。它是python,缩进让我着迷。感谢您的回答
  • 应该指出,这种循环是极其低效的。这个答案好多了stackoverflow.com/a/41623434/3556705
猜你喜欢
  • 2016-10-20
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2012-04-12
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多