我将编写一个Python程序来检查文件是否在我的Google Cloud Storage的某个文件夹中,基本思想是获得文件夹中所有对象的list
,文件名list
,然后检查文件abc.txt
是否在文件名list
中。
现在的问题是,它看起来谷歌只提供一种方式来获得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
的特定文件夹(e)。g gs//mybucket/abc/myfolder
),这应该很快。
有人能帮忙回答吗?感谢每一个回答!
Update:以下内容适用于Python较旧的"Google API客户端库",但如果您不使用该客户端,请选择Python较新的"Google Cloud Client Library" (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客户端。它有一个用于列出对象的函数,该函数接受一个prefix参数,您可以使用该参数以以下方式检查某个目录及其子目录:
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/
这对我有用:
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()方法将返回一个迭代器,用于在bucket中查找blob。现在您可以遍历blob并访问bucket中的每个对象。在这个例子中,我只是打印出对象的名称。
这个文档帮助了我很多:
- 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客户端。桶
希望我能帮上忙!
您可能还需要查看gcloud-python和文档。
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!'
通过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))
我知道这是一个老问题,但我绊倒了这个,因为我正在寻找完全相同的答案。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)从文件名中删除前缀,你可以这样做:
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}")