【问题标题】:Determine if folder or file key - Boto确定文件夹或文件键 - Boto
【发布时间】:2019-06-23 23:17:48
【问题描述】:

使用 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>

【问题讨论】:

  • 参见stackoverflow.com/questions/29657384/… .... 你应该使用import osos.path.basename 方法来提取你的目录。这不是该帖子中公认的答案,但我认为它会做你想要的。迭代您的对象并首先调用密钥。例如files_in_bucket = list(my_bucket.objects.all()) # iterate and remove any portion of the key beyond the last '/' paths_in_bucket = [os.path.dirname(files_in_bucket[x].key) for x in range(len(files_in_bucket))]

标签: python amazon-web-services amazon-s3 boto


【解决方案1】:

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))

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

【讨论】:

    【解决方案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 也能很好地工作(而且通常会更好,原因您正在发现!)。

    【讨论】:

    • 谢谢约翰,这很有帮助
    • 仅使用 boto 可以实现吗,对于我正在从事的项目,我无法使用 Boto 3
    • 是的,boto 中会有类似的命令。请注意,您可以将botoboto3 混合使用,方法是导入两者并使用您希望的任何一个。谁对你强加“not boto3”规则就是在伤害自己。它不再使用新的 AWS 服务进行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2010-12-28
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2011-03-01
    相关资源
    最近更新 更多