我使用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 文件。(文件名是动态的,可以是任何内容)
从云存储获取数据时,是否有任何选项可以像正则表达式过滤器一样使用?
如果您想根据正则表达式检查文件名/扩展名,这非常简单。
只需在开始时导入“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”
这可能是 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]
**
表示匹配一个或多个任何内容,包括文件夹斜杠。