Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-列出Bucket中的文件和文件夹_Python_Amazon Web Services_Amazon S3_Boto - Fatal编程技术网

Python-列出Bucket中的文件和文件夹

Python-列出Bucket中的文件和文件夹,python,amazon-web-services,amazon-s3,boto,Python,Amazon Web Services,Amazon S3,Boto,我正在使用boto库访问AmazonS3存储桶。我试图列出bucket中给定文件夹中的所有文件和文件夹。我使用此选项获取所有文件和文件夹: for key in bucket.list(): print key.name 这将提供根目录中的所有文件和文件夹,以及其中包含文件的子文件夹,如下所示: root/ file1 file2 folder1/file3 folder1/file4 folder1/folder2/file5 folder1/folder2/file6

我正在使用
boto
库访问AmazonS3存储桶。我试图列出bucket中给定文件夹中的所有文件和文件夹。我使用此选项获取所有文件和文件夹:

for key in bucket.list():
    print key.name
这将提供根目录中的所有文件和文件夹,以及其中包含文件的子文件夹,如下所示:

root/
 file1
 file2
 folder1/file3
 folder1/file4
 folder1/folder2/file5
 folder1/folder2/file6
我怎样才能只列出say
folder1
的内容,其中会列出如下内容:

files:
 file3
 file4

folders:
 folder2
我可以使用

for key in in bucket.list(prefix=path/to/folder/)
但在这种情况下,它会将
folder2
中的文件列为
folder1
的文件,因为我尝试在bucket路径上使用字符串管理。我尝试过每种情况,但如果路径较长,并且文件夹有多个文件和文件夹(这些文件夹有更多文件),它仍然会中断。有没有一种递归的方法来处理这个问题?

S3没有可能想到的“文件夹”的概念。它是一个单级层次结构,其中文件按键存储


如果需要在文件夹中执行单级列表,则必须在代码中约束该列表。类似于
if key.count('/')==1

关于S3,我发现最难完全理解的是它只是一个简单的存储,而不是大多数人熟悉的磁盘或其他类型的基于文件的存储。人们将键称为文件夹,将值称为文件,这一事实有助于消除使用键的最初混乱

作为键/值存储,键只是标识符,而不是进入目录结构的实际路径。这意味着您不需要在引用文件夹之前实际创建文件夹,因此您可以简单地将对象放入桶中的某个位置,如
/path/to/my/object
,而无需首先创建“目录”
/path/to/my

由于S3是一个键/值存储,因此与之交互的API更多地基于对象和哈希,而不是基于文件。这意味着,无论是使用Amazon的本机API还是使用boto,类似这样的函数都将列出一个bucket中的所有对象,并可选地根据前缀进行过滤。如果指定前缀/foo/bar,则会列出带有该前缀的所有内容,包括
/foo/bar/file
/foo/bar/blargh/file
/foo/bar/1/2/3/file
,等等


因此,简单的回答是,您需要过滤掉您不希望从调用中得到的结果,因为函数如下:,etc.都被设计为返回指定为筛选器的前缀下的所有键。

所有信息都是正确的,其他答案是正确的,但由于许多人在S3中使用类似路径的键存储对象,API确实提供了一些工具来帮助您处理它们

例如,在您的情况下,如果您只想列出
根目录的“子目录”,而不列出下面的所有对象,您可以这样做:

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/

等等。使用这种方法,您可能可以完成您想要的任务。

我认为这可能只适用于Boto 2。