Google Cloud Storage + Python:有啥方法可以在 GCS 的某个文件夹中列出 obj?
Posted
技术标签:
【中文标题】Google Cloud Storage + Python:有啥方法可以在 GCS 的某个文件夹中列出 obj?【英文标题】:Google Cloud Storage + Python : Any way to list obj in certain folder in GCS?Google Cloud Storage + Python:有什么方法可以在 GCS 的某个文件夹中列出 obj? 【发布时间】:2014-03-14 07:39:39 【问题描述】:我要编写一个Python程序来检查文件是否在我的Google Cloud Storage的某个文件夹中,基本思想是获取文件夹中所有对象的list
,文件名list
,然后检查文件abc.txt
是否在文件名list
中。
现在的问题是,看起来 Google 只提供了一种获取 obj
list
的方法,即 uri.get_bucket()
,请参见下面来自 https://developers.google.com/storage/docs/gspythonlibrary#listing-objects 的代码
uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for obj in uri.get_bucket():
print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name)
print ' "%s"' % obj.get_contents_as_string()
uri.get_bucket()
的缺陷是,它看起来是先获取所有对象,这是我不想要的,我只需要获取特定文件夹的 obj
名称 list
(例如 @987654333 @) ,应该很快。
有人可以帮忙解答吗?感谢每一个答案!
【问题讨论】:
【参考方案1】:更新:以下适用于 Python 的旧版“Google API 客户端库”,但如果您不使用该客户端,请选择较新的 Python 版“Google Cloud 客户端库”( https://googleapis.dev/python/storage/latest/index.html)。对于较新的库,等效于以下代码:
from google.cloud import storage
client = storage.Client()
for blob in client.list_blobs('bucketname', prefix='abc/myfolder'):
print(str(blob))
老客户的回答如下。
您可能会发现使用 JSON API 更容易,它有一个功能齐全的 Python 客户端。它有一个用于列出带有前缀参数的对象的功能,您可以使用它以这种方式检查某个目录及其子目录:
from apiclient import discovery
# Auth goes here if necessary. Create authorized http object...
client = discovery.build('storage', 'v1') # add http=whatever param if auth
request = client.objects().list(
bucket="mybucket",
prefix="abc/myfolder")
while request is not None:
response = request.execute()
print json.dumps(response, indent=2)
request = request.list_next(request, response)
列表调用的更完整文档在这里:https://developers.google.com/storage/docs/json_api/v1/objects/list
Google Python API 客户端记录在这里: https://code.google.com/p/google-api-python-client/
【讨论】:
您能建议如何定义客户端吗?我已经导入了json和apiclient,但是会抛出NameError: name 'client' is not defined,我查了文档没有找到这部分代码,谢谢! 在上面添加了一些示例语法。 有什么办法可以加快速度吗?数百万个 blob 会变慢【参考方案2】:这对我有用:
client = storage.Client()
BUCKET_NAME = 'DEMO_BUCKET'
bucket = client.get_bucket(BUCKET_NAME)
blobs = bucket.list_blobs()
for blob in blobs:
print(blob.name)
list_blobs() 方法将返回一个迭代器,用于在存储桶中查找 blob。 现在您可以遍历 blob 并访问存储桶中的每个对象。在这个例子中,我只是打印出对象的名称。
这份文档对我帮助很大:
https://googleapis.github.io/google-cloud-python/latest/storage/blobs.html
https://googleapis.github.io/google-cloud-python/latest/_modules/google/cloud/storage/client.html#Client.bucket
希望能帮到你!
【讨论】:
如果你想过滤特定文件夹中的文件,请使用bucket.list_blobs(prefix="path")
适用于旧版本的 google api。谢谢【参考方案3】:
您可能还想查看gcloud-python 和documentation。
from gcloud import storage
connection = storage.get_connection(project_name, email, private_key_path)
bucket = connection.get_bucket('my-bucket')
for key in bucket:
if key.name == 'abc.txt':
print 'Found it!'
break
但是,最好只检查文件是否存在:
if 'abc.txt' in bucket:
print 'Found it!'
【讨论】:
我在 Windows 7 上工作,我未能轻松安装 gcloud,最后它会以 警告结束:未找到 GMP 或 MPIR 库;不构建 Crypto.PublicKey._fastmath。错误:安装脚本退出并出现错误:无法找到 vcvarsall.bat,您能建议一下吗?谢谢! 您是否安装了 PyCrypto 和所有这些?我相信这些的 Windows 安装程序可以在线获得。【参考方案4】:通过 pip 或 pycharm 安装 python 包 google-cloud-storage 并使用以下代码
from google.cloud import storage
client = storage.Client()
for blob in client.list_blobs(BUCKET_NAME, prefix=FOLDER_NAME):
print(str(blob))
【讨论】:
【参考方案5】:我知道这是一个老问题,但我偶然发现了这个问题,因为我正在寻找完全相同的答案。 Brandon Yarbrough 和 Abhijit 的回答对我有用,但我想了解更多细节。
当你运行这个时:
from google.cloud import storage
storage_client = storage.Client()
blobs = list(storage_client.list_blobs(bucket_name, prefix=PREFIX, fields="items(name)"))
您将获得 Blob 对象,其中只有给定存储桶中所有文件的名称字段,如下所示:
[<Blob: BUCKET_NAME, PREFIX, None>,
<Blob: xml-BUCKET_NAME, [PREFIX]claim_757325.json, None>,
<Blob: xml-BUCKET_NAME, [PREFIX]claim_757390.json, None>,
...]
如果您像我一样想要 1) 过滤掉列表中的第一项,因为它不代表文件 - 它只是前缀,2) 只获取名称字符串值,以及 3) 删除 PREFIX从文件名中,您可以执行以下操作:
blob_names = [blob_name.name[len(PREFIX):] for blob_name in blobs if blob_name.name != folder_name]
仅从存储桶中获取字符串文件名的完整代码:
from google.cloud import storage
storage_client = storage.Client()
blobs = list(storage_client.list_blobs(bucket_name, prefix=PREFIX, fields="items(name)"))
blob_names = [blob_name.name[len(PREFIX):] for blob_name in blobs if blob_name.name != folder_name]
print(f"blob_names = blob_names")
【讨论】:
以上是关于Google Cloud Storage + Python:有啥方法可以在 GCS 的某个文件夹中列出 obj?的主要内容,如果未能解决你的问题,请参考以下文章
Spring + google cloud:没有可用的“com.google.cloud.storage.Storage”类型的合格bean
ReferenceError:导入@google-cloud/storage 时分配的左侧无效
错误:模块“google.cloud.bigquery_storage”没有属性“BigQueryReadClient”
使用 Cloud Functions for Firebase 和 @google-cloud/storage 删除图像时出现问题