如何使用Python为Google Cloud Storage Bucket应用正则表达式

问题描述 投票:0回答:2

我使用python从Google Cloud Storage获取对象,文件夹中有很多文件(大约20000个)。

但我只需要一个特定的文件,即 .json 文件,所有其他文件均为 csv 格式。现在我使用以下带有前缀选项的代码:

from google.cloud import storage
import json
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)

blobs = list(bucket.list_blobs(prefix="input"))

for blob in blobs:
    if '.json' in blob.name:
        filename = blob.name
        break

这个过程不稳定,因为文件数量会增加,并且需要很多时间来过滤 json 文件。(文件名是动态的,可以是任何内容)

从云存储获取数据时,是否有任何选项可以像正则表达式过滤器一样使用?

python google-cloud-platform google-cloud-storage
2个回答
2
投票

如果您想根据正则表达式检查文件名/扩展名,这非常简单。

只需在开始时导入“re”模块即可

import re

并检查循环内的正则表达式:

for blob in blobs:
    if re.match(r'\.json$',blob.name):
        filename = blob.name
        break

您可以在 regex101.com 上开发正则表达式,然后再将其刻录到您的代码中。

顺便说一句 - 我更喜欢使用 str.endswith 检查扩展,速度相当快:

for blob in blobs:
    if blob.name.endswith('.json'):
        filename = blob.name
        break

我不会用

if '.json' in filename:
   etc...

因为它可能与任何其他文件名匹配,例如“compressed.json.gz”


0
投票

这可能是 python sdk 中的新功能,但您可以将匹配 glob 传递到列表 blobs 函数中。

请参阅此处的说明。要点是使用标准文件 glob 语法将

match_glob
参数传递给 list_blobs 函数。

from google.cloud import storage
import json
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)

blobs = list(bucket.list_blobs(prefix="input", match_glob="**.json"))
filenames = [blob.name for blob in blobs]

**
表示匹配一个或多个任何内容,包括文件夹斜杠。

© www.soinside.com 2019 - 2024. All rights reserved.