You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python Lambda获取S3桶文件名并输出为数组格式?

问题描述

在S3桶中上传了多个文件,想通过Python Lambda获取所有文件名,输出成['S1','S2','S3']这样的数组格式。试了下面的代码,但现在输出是每个文件名单独一行,虽然试过用列表append方法,却没得到预期结果。

尝试的代码

import boto3
import json
from datetime import datetime as dt

client = boto3.resource('s3')
s3_client = boto3.client('s3')
def lambda_handler(event, context):
    paginator = s3_client.get_paginator('list_objects')

    # Create a PageIterator from the Paginator
    page_iterator = paginator.paginate(Bucket='mylocals3bucketpoc')
    for page in page_iterator:
    vars = []
        for Contents in page['Contents']:
            print(Contents['Key'])

当前输出

S1
S2
S3

期望输出

['S1','S2','S3']


解决方案

你的代码里有两个核心问题:

  • 列表vars定义在了for page in page_iterator循环内部,每次循环都会重新创建空列表,根本存不住所有文件名。
  • 只是逐个打印文件名,没把它们添加到列表里,最后也没输出整个列表。

修正后的代码如下:

import boto3

def lambda_handler(event, context):
    s3_client = boto3.client('s3')
    # 把列表初始化放在循环外面,确保能累积所有文件名
    file_names = []
    # 推荐用list_objects_v2,是S3 API的新版本,更高效
    paginator = s3_client.get_paginator('list_objects_v2')
    page_iterator = paginator.paginate(Bucket='mylocals3bucketpoc')
    
    for page in page_iterator:
        # 加个判断,避免桶为空时抛出KeyError
        if 'Contents' in page:
            for obj in page['Contents']:
                file_names.append(obj['Key'])
    
    # 打印出你要的数组格式
    print(file_names)
    # 如果需要把结果返回给Lambda的调用方,可以return file_names
    return file_names

关键说明

  1. 列表初始化移到循环外部,保证所有分页的文件名都能被收集到同一个列表里。
  2. 替换成list_objects_v2,相比旧版的list_objects,性能更好,还支持更多功能。
  3. 增加'Contents' in page的判断,防止桶里没有文件时触发报错。
  4. 最后打印整个列表,输出格式就是你想要的['S1','S2','S3']。

内容的提问来源于stack exchange,提问作者Utso Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:01:04