确定文件夹或文件密钥 - Boto

Ric*_*wis 4 python amazon-s3 boto amazon-web-services

使用 boto 和 Python,我试图区分密钥是否返回文件文件夹(我知道 S3 对待两者完全相同,因为我不直接处理文件系统)。

我现在有2把钥匙

<Key: my-folder,output/2019/01/28/>
<Key: my-folder,output/2019/01/28/part_1111>
Run Code Online (Sandbox Code Playgroud)

第一个是“文件夹”,第二个是“文件”。我想做的是确定密钥是否是“文件”,但不确定如何确定这一点,显然密钥不以 a 结尾,/但我如何在 Python 中确定这一点。

如果我迭代 a ,list()我可以将键转换为字符串或访问键属性吗?

for obj in srcBucket.list():
   # Get the Key object of the given key, in the bucket
   k = Key(srcBucket, obj.key)
   print(k)
   <Key: my-folder,output/2019/01/28/>
   <Key: my-folder,output/2019/01/28/part_1111>
Run Code Online (Sandbox Code Playgroud)

pld*_*rov 6

S3.ObjectS3.ObjectSummary将具有以下属性:

'ContentType': '应用程序/x-目录'

如果键是目录。

for s3_obj_summary in bucket.objects.all():
  if s3_obj_summary.get()['ContentType'] == 'application/x-directory':
    print(str(s3_obj_summary))
Run Code Online (Sandbox Code Playgroud)

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.ObjectSummary.get


Joh*_*ein 5

您是对的,文件夹不存在。例如,您可以创建一个名为“output/2020/01/01/foo.txt即使这些子文件夹都不存在”的文件。

然而,某些系统喜欢通过使用假装文件夹的名称创建零长度对象来“创建”文件夹。在这种情况下,您可以通过检查对象的长度来识别“文件夹”。

这是一些示例代码(使用 boto3 客户端方法):

import boto3

s3 = boto3.client('s3', region_name = 'ap-southeast-2')

response = s3.list_objects_v2(Bucket='my-bucket')

for object in response['Contents']:
  if object['Size'] == 0:
      # Print name of zero-size object
      print(object['Key'])
Run Code Online (Sandbox Code Playgroud)

按照官方说法,这样的“文件夹文件”没有理由存在。没有它们,Amazon S3 也能完美运行(而且通常会更好,原因您正在发现!)。