list_objects_v2() 有时 returns 第一个键值不正确
list_objects_v2() sometimes returns first key value incorrectly
我目前正在使用 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 天的时间试图弄清楚为什么它会为某些存储桶文件夹返回 'null' 文件名,但其他存储桶文件夹却有效。不确定它是否相关,但有效的前缀都在同一天上传到 S3,而无效的前缀都在不同的一天上传。也许这是存储桶权限问题?我真的不确定...
我已经通过在 for 循环中添加一个 if 语句找到了解决这个问题的方法:
if item['Size'] == 0:
pass
else:
print item['Key']
不过,我只想知道为什么它会这样输出。
提前致谢!
目录在 S3 中不是真实的,但是,当您创建 S3 数据集时,许多工具将创建一个元数据结构,该结构大致映射到常规文件系统上的目录。
当您使用 boto 进行查询时,如果这些元数据构造是由您用来上传的工具创建的,您将看到它们。
我目前正在使用 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 天的时间试图弄清楚为什么它会为某些存储桶文件夹返回 'null' 文件名,但其他存储桶文件夹却有效。不确定它是否相关,但有效的前缀都在同一天上传到 S3,而无效的前缀都在不同的一天上传。也许这是存储桶权限问题?我真的不确定...
我已经通过在 for 循环中添加一个 if 语句找到了解决这个问题的方法:
if item['Size'] == 0:
pass
else:
print item['Key']
不过,我只想知道为什么它会这样输出。
提前致谢!
目录在 S3 中不是真实的,但是,当您创建 S3 数据集时,许多工具将创建一个元数据结构,该结构大致映射到常规文件系统上的目录。
当您使用 boto 进行查询时,如果这些元数据构造是由您用来上传的工具创建的,您将看到它们。