list_objects_v2()有时会错误地返回第一个键值

时间:2016-10-18 17:42:08

标签: python amazon-s3 boto3

我目前正在使用boto3编写Python脚本,该脚本在存储桶中打开S3文件夹(前缀)并打印出该文件夹的内容(XML指针文件名)。我的代码是:

def getXMLFileName(self, bucketName, prefix): 
    session = boto3.Session(profile_name=self.profileName)
    s3client = session.client('s3')

try:
    for item in s3client.list_objects_v2(Bucket = bucketName, Prefix = prefix, MaxKeys = 5)['Contents']:
       print item['Key']

以下代码确实有效。它将打印类似于:

的内容
 PrefixName/This.Is.The.XML.Filename1.xml
 PrefixName/This.Is.The.XML.Filename2.xml
 PrefixName/This.Is.The.XML.Filename3.xml
 PrefixName/This.Is.The.XML.Filename4.xml
 PrefixName/This.Is.The.XML.Filename5.xml

但是,根据我输入的前缀,有些会打印我上面的内容,这是正确的,但有时它只打印出第一项的前缀名称(即PrefixName /),然后打印出来正确的其余文件。所以在这种情况下,它打印:

 PrefixName/
 PrefixName/This.Is.The.XML.Filename1.xml
 PrefixName/This.Is.The.XML.Filename2.xml
 PrefixName/This.Is.The.XML.Filename3.xml
 PrefixName/This.Is.The.XML.Filename4.xml

我不确定为什么要这样做。我花了至少2天的时间试图弄清楚为什么它会返回“无效”状态。某些存储桶文件夹的文件名,但其他工作的文件名不确定它是否相关,但是DO工作的前缀都在同一天上传到S3,而DON&T; T工作的前缀全部上传到不同的一天。也许这是一个存储桶权限问题?我真的不确定......

通过在f​​or循环中添加if语句,我找到了解决这个问题的方法:

if item['Size'] == 0:
    pass
else:
    print item['Key']

但是,我只是想知道它为什么这样输出。

提前致谢!

1 个答案:

答案 0 :(得分:1)

S3中的目录并不真实,但是,当您创建S3数据集时,许多工具将创建一个大致映射到常规文件系统上的目录的元数据结构。

当您使用boto进行查询时,如果它们是您用来上传的工具创建的,那么您将看到这些元数据结构。