使用boto和Python,我试图区分密钥是否返回文件文件夹(我知道S3对待这两者的方式与我不直接处理文件系统的方式完全相同)。
此刻我只有2个键
<Key: my-folder,output/2019/01/28/>
<Key: my-folder,output/2019/01/28/part_1111>
第一个是“文件夹”,第二个是“文件”。我想做的是确定密钥是否为“文件”,但不确定如何确定,显而易见的是密钥不是以/
结尾,而是如何在Python中确定。
如果我在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>
答案 0 :(得分:2)
您正确地认为文件夹不存在。例如,即使不存在这些子文件夹,也可以创建一个名为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'])
从官方上讲,没有理由存在这样的“文件夹文件”。没有它们,Amazon S3会完美地运行(而且由于发现的原因,它通常会更好!)。
答案 1 :(得分:0)
S3.Object和S3.ObjectSummary将具有以下属性:
'ContentType':'application / x-directory'
如果键是目录。
for s3_obj_summary in bucket.objects.all():
if s3_obj_summary.get()['ContentType'] == 'application/x-directory':
print(str(s3_obj_summary))