【问题标题】:List only files from the Google cloud storage仅列出 Google 云存储中的文件
【发布时间】:2020-07-07 20:40:21
【问题描述】:

在 GCS 中,我有存储桶 XYZ,在它下面有文件夹 JM,在它下面有文件。例如:

XYZ/JM/file1.tar.gz,XYZ/JM/file2.tar.gz,XYZ/JM/file3.tar.gz,XYZ/JM/file4.tar.gz等

使用下面的代码,我可以列出文件,但它显示的完整路径如下:

JM/file1.tar.gz,JM/file2.tar.gz,JM/file3.tar.gz

代码

from google.cloud import storage
storage_client = storage.Client.from_service_account_json()

BucketName="XYZ"
bucket=storage_client.get_bucket(BucketName)


filename=list(bucket.list_blobs(prefix="jm/"))
for name in filename:
       print(name.name)

查询:我想列出文件夹 JM 下的文件。我不想在列表中显示 JM,只显示文件 ex:file1.tar.gz,file2.tar.gz

【问题讨论】:

    标签: python google-cloud-platform google-cloud-storage


    【解决方案1】:

    Cloud Storage 中的所有内容都被视为一个对象(甚至是文件夹)。请注意,如documentation 所述:

    对于服务,对象 gs://your-bucket/abc/def.txt 只是一个名称中恰好包含“/”字符的对象。没有“abc”目录;只是一个具有给定名称的对象。

    这就是您在使用list_blobs() method 时收到完整对象“路径”的原因,这实际上是对象的真实名称。

    您用于过滤 blob 的 list_blobs() method 函数的 prefix 参数应该足以列出您要查找的特定对象。

    但之后,您需要考虑使用regex 或类似的string splitting 方法,方法是使用“/”字符拆分以获得您认为相关的blob 名称部分。

    编辑

    我测试了以下内容并成功:

    from google.cloud import storage
    storage_client = storage.Client.from_service_account_json()
    
    BucketName="XYZ"
    bucket=storage_client.get_bucket(BucketName)
    
    
    filename=list(bucket.list_blobs(prefix="jm/"))
    for name in filename:
        try:
            prefix, object_name = name.name.split('/')
        except:
            print("An error occurred splitting the string.")
        print(object_name)
    

    【讨论】:

    • 你说的没错,所有文件夹都被视为对象。但我仍然想知道是否有其他可用的方法或任何参数来修剪该对象值。
    • 我尝试使用替换或修剪功能但没有奏效,将尝试使用您所说的 reg exp 或 split 功能。感谢您的建议。
    • @RaghavendraK 我添加了一个使用拆分功能的代码。我在您的特定设置中对其进行了测试,它工作正常(不过,您需要避免使用文件名上带有 / 的对象。
    • 感谢 Daniel 提供了上面的代码,它的工作和我的预期一样。由于我是 python 新手,只是想知道“名称”的类型是“google.cloud.storage.blob.Blob”,我们可以使用其他方法,如替换或修剪吗?
    • 您将无法在name 变量本身上使用replace()strip()字符串方法。你已经知道it's a wrapper around Cloud Storage’s concept of an Object 而不是字符串。尽管如此,Blob 对象的name 属性实际上是一个字符串,因此您可以使用name.name.replace()name.name.strip(),就像我对split() 字符串方法所做的那样。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2019-01-24
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多