如何用Python Boto3列出S3中/my_folder下排除/logs的文件?
S3 排除指定文件夹列出文件的解决方案
你之前用Delimiter="/logs"的方式不对,这个参数的作用是按指定字符对对象路径进行分组,不是用来排除特定文件夹的。要实现排除/my_folder/logs/下的文件,有两种可靠的方式:
方法一:列出所有对象后过滤结果
先通过list_objects_v2获取/my_folder/下的所有对象,再手动过滤掉路径以/my_folder/logs/开头的条目。注意要处理分页情况(当对象数量超过1000时会自动分页):
import boto3 s3 = boto3.client('s3') BUCKET_NAME = '你的桶名称' input_key = 'my_folder/' # 初始化结果列表和分页参数 filtered_files = [] response = s3.list_objects_v2(Bucket=BUCKET_NAME, Prefix=input_key) # 处理第一页结果 filtered_files.extend([ obj for obj in response.get('Contents', []) if not obj['Key'].startswith(f"{input_key}logs/") ]) # 处理后续分页 while response.get('IsTruncated'): response = s3.list_objects_v2( Bucket=BUCKET_NAME, Prefix=input_key, ContinuationToken=response['NextContinuationToken'] ) filtered_files.extend([ obj for obj in response.get('Contents', []) if not obj['Key'].startswith(f"{input_key}logs/") ]) # 输出过滤后的文件 for file in filtered_files: print(file['Key'])
方法二:利用S3 Select(适合大量对象场景)
如果/my_folder/下对象数量极多,手动过滤效率低,可以用S3 Select直接在服务端过滤:
import boto3 s3 = boto3.client('s3') BUCKET_NAME = '你的桶名称' prefix = 'my_folder/' # 构造查询语句,排除logs路径下的对象 query = """ SELECT s.* FROM s3object s WHERE NOT s._1 LIKE 'my_folder/logs/%' """ response = s3.select_object_content( Bucket=BUCKET_NAME, ExpressionType='SQL', Expression=query, InputSerialization={'CSV': {'FileHeaderInfo': 'NONE'}}, OutputSerialization={'CSV': {}} ) # 解析返回结果 for event in response['Payload']: if 'Records' in event: records = event['Records']['Payload'].decode('utf-8') for line in records.split('\n'): if line: print(line.split(',')[0]) # 输出对象Key
注意事项
- 第一种方法简单直接,适合对象数量不多的场景;
- 第二种方法由S3服务端完成过滤,减少本地数据传输,适合海量对象的情况;
- 确保你的IAM权限包含
s3:ListBucket(方法一)或s3:SelectObjectContent(方法二)权限。
内容的提问来源于stack exchange,提问作者eduardosufan
相关产品推荐
相关产品推荐

