【问题标题】:Trying to determine if an S3 path exists in code尝试确定代码中是否存在 S3 路径
【发布时间】:2021-11-03 18:26:38
【问题描述】:

所以我正在创建一个粘合作业,其中一部分是检查 s3 中是否存在路径。想象一下我有这样一条路径: s3://my-bucket/level0/level1/level2(等)

使用变量: varBucket = "我的桶" varKey = "level0/"

那么这段代码就是这样工作的:

import boto3

from botocore.errorfactory import ClientError

    s3 = boto3.client('s3')        
    try:
                s3.head_object(Bucket=varBucket, Key=varKey)
                print("Path Exists")
            except ClientError:
                print("Path Does Not Exist")
                pass

我得到“路径存在”的打印输出 但是,如果我将密钥更改为此: varKey="level0/level1/"

然后我得到“路径不存在”的打印 - 即使我知道它存在。我可以在 s3 中去那里。 几乎就好像我只能用钥匙进入 1 级,但是一旦我尝试进入下一个级别及更高级别,就会发生异常。有什么想法我哪里出错了吗?

【问题讨论】:

  • 为什么要知道“路径”是否存在?使用 S3,您无需担心创建目录。
  • 因为我正在构建一个每日分区数组以在具有“NumberOfDays”变量的数据框中使用以向后退。有时一天会丢失(当以前的脚本没有运行时)并且当我将数组传递到“spark.read.option("mergeSchema", "true").parquet(*bucket_path_array)" 时,如果路径不存在,那么这失败了

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


【解决方案1】:

S3 中没有“目录”,只有前缀。

如果您有一个文件s3://my-bucket/level0/level1/level2/file.dat,则没有名为level0/level1/ 的“目录”对象。

您可以使用带有Prefix= 的列表对象调用来过滤其键(例如level0/level1/level2/file.dat)以此类前缀开头的对象,但尝试在前缀上使用HeadObjectGetObject 将不起作用。

【讨论】:

    【解决方案2】:

    好的,所以我得到了一些工作 - 可能很笨重,但经过测试可以正常工作:

            for my_bucket_object in s3.Bucket(varBucket).objects.filter(Prefix=varKey):
            if varKey in my_bucket_object.key:
                ##Do Stuff
                break
    

    基本上如果key存在于bucket中,就会DoStuff。在我的例子中,将完整的 s3 URI 添加到一个数组中以供以后使用。

    【讨论】:

      【解决方案3】:

      如果该路径中有文件,则目录会神奇地出现在 S3 中。如果那里没有文件,它们就会神奇地消失。

      如果您想知道它们是否“存在”,请致电:

      list_objects(Bucket='your-bucket', Delimiter='/')
      

      并查看返回的CommonPrefixes 列表。它们相当于目录。

      要更深入地查看目录,还要指定Prefix,例如:

      list_objects(Bucket='your-bucket', Delimiter='/', Prefix='level0/level1/')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2011-03-26
        • 2022-11-14
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多