【问题标题】:S3 boto3 list directories onlyS3 boto3 仅列出目录
【发布时间】:2022-02-08 04:52:29
【问题描述】:

我在 S3 中具有以下层次结构,并且只想检索不包括以 .txt 结尾的文件的子文件夹类型信息(基本上排除文件名并仅检索前缀/文件夹)。

--folder1/subfolder1/item1.txt
--folder1/subfolder1/item11.txt
--folder1/subfolder2/item2.txt
--folder1/subfolder2/item21.txt
--folder1/subfolder3/item3.txt
--folder1/subfolder3/subfolder31/item311.txt 

期望的输出:

--folder1/subfolder1
--folder1/subfolder2
--folder1/subfolder3/subfolder31

我了解 S3 中没有文件夹/子文件夹,但都是键。

我尝试了下面的代码,但它显示了所有信息,包括文件名,如item1.txt

s3 = boto3.resource('s3')
client = boto3.client('s3')
bucket = s3.Bucket('s3-bucketname')
paginator = client.get_paginator('list_objects')


objs = list(bucket.objects.filter(Prefix='folder1/'))
for i in range(0, len(objs)):
    print(objs[i].key)

有什么建议可以低于输出吗?

--folder1/subfolder1
--folder1/subfolder2
--folder1/subfolder3/subfolder31

【问题讨论】:

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


【解决方案1】:

正如你所说,S3 并没有真正的文件夹概念,所以要得到你想要的,从某种意义上说,你需要重新创建它。

一种选择是列出存储桶中的所有对象,并构造每个对象的文件夹或前缀,并在遇到它们时对新名称进行操作:

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('s3-bucketname')
shown = set()
for obj in bucket.objects.filter(Prefix='folder1/'):
    prefix = "/".join(obj.key.split("/")[:-1])
    if len(prefix) and prefix not in shown:
        shown.add(prefix)
        print(prefix + "/")

【讨论】:

  • 谢谢。有没有一种简单的方法可以将此 print(prefix + "/") 发送到 S3 中的 csv 文件?我认为我的输出获得了超过 1000 条记录,并且只想将其存储在一个文件中。
猜你喜欢
  • 1970-01-01
  • 2018-08-28
  • 2013-07-07
  • 2016-03-15
  • 2019-06-03
  • 2017-10-27
  • 2021-11-25
  • 2016-03-15
  • 2012-10-22
相关资源
最近更新 更多