我正在玩boto
库以访问亚马逊s3存储桶。我试图列出存储桶中给定文件夹中的所有文件和文件夹。我使用它来获取所有文件和文件夹:
for key in bucket.list():
print key.name
这为我提供了根目录中的所有文件和文件夹,以及它包含文件的子文件夹,如下所示:
root/
file1
file2
folder1/file3
folder1/file4
folder1/folder2/file5
folder1/folder2/file6
如何仅列出说folder1
的内容,其中列出的内容如下:
files:
file3
file4
folders:
folder2
我可以使用
导航到一个文件夹for key in in bucket.list(prefix=path/to/folder/)
但在这种情况下,它会将folder2
中的文件列为folder1
的文件,因为我正在尝试在存储桶路径上使用字符串操作。我已经尝试了每个场景,如果有更长的路径,文件夹有多个文件和文件夹(这些文件夹有更多文件),它仍会中断。是否有一种递归方式来处理这个问题?
答案 0 :(得分:8)
所有信息都是其他答案是正确的,但由于很多人在S3中存储了具有类路径键的对象,因此API确实提供了一些工具来帮助您处理它们。
例如,在您的情况下,如果您只想列出root
的“子目录”而不列出下面的所有对象,则可以执行此操作:
for key in bucket.list(prefix='root/', delimiter='/'):
print(key.name)
应产生输出:
file1
file2
folder1/
然后你可以这样做:
for key in bucket.list(prefix='root/folder1/', delimiter='/'):
print(key.name)
并获得:
file3
file4
folder2/
等等。你可以通过这种方法完成你想要的任务。
答案 1 :(得分:3)
我发现最难以完全掌握的是它只是一个key/value store而不是大多数人都熟悉的磁盘或其他类型的基于文件的商店。人们将密钥称为文件夹和值作为文件这一事实有助于最初混淆使用它。
作为键/值存储,键只是标识符而不是目录结构中的实际路径。这意味着您无需在引用文件夹之前实际创建文件夹,因此您只需将对象放在像/path/to/my/object
这样的位置的存储桶中,而无需先创建“目录”/path/to/my
。
因为S3是一个键/值存储,所以用于与它交互的API更具对象和价值。基于散列而不是基于文件。这意味着,无论是使用Amazon的本机API还是使用boto,s3.bucket.Bucket.list等函数都会列出存储桶中的所有对象,并可选择对前缀进行过滤。如果您指定前缀/ foo / bar,则会列出具有该前缀的所有内容,包括/foo/bar/file
,/foo/bar/blargh/file
,/foo/bar/1/2/3/file
等。
所以简短的回答是,您需要在调用s3.bucket.Bucket.list时过滤掉您不想要的结果,因为s3.bucket.Bucket.list,s3.bucket.Bucket.get_all_keys等功能是all旨在返回您指定为过滤器的前缀下的所有键。
答案 2 :(得分:2)
S3没有"文件夹"的概念。可能会想到。它是一个单级层次结构,其中文件按密钥存储。
如果您需要在文件夹中执行单个级别的列表,则必须限制代码中的列表。像if key.count('/')==1