如何从 Python3上传文件到 谷歌云存储? 最终是 Python2,如果它在 Python3上不可行的话。
我找了又找,但还没找到真正有效的解决方案。我尝试了 Boto,但是当我尝试生成必要的。Boto 文件通过 gsutil config -e,它一直说我需要通过 gcloud auth login配置身份验证。然而,我已经做了后者的数次,没有它的帮助。
gsutil config -e
gcloud auth login
使用标准的 GCloud库,它同时支持 Python2和 Python3。
from gcloud import storage from oauth2client.service_account import ServiceAccountCredentials import os credentials_dict = { 'type': 'service_account', 'client_id': os.environ['BACKUP_CLIENT_ID'], 'client_email': os.environ['BACKUP_CLIENT_EMAIL'], 'private_key_id': os.environ['BACKUP_PRIVATE_KEY_ID'], 'private_key': os.environ['BACKUP_PRIVATE_KEY'], } credentials = ServiceAccountCredentials.from_json_keyfile_dict( credentials_dict ) client = storage.Client(credentials=credentials, project='myproject') bucket = client.get_bucket('mybucket') blob = bucket.blob('myfile') blob.upload_from_filename('myfile')
一个将文件上传到 gcloud bucket 的简单函数。
from google.cloud import storage #pip install --upgrade google-cloud-storage. def upload_to_bucket(blob_name, path_to_file, bucket_name): """ Upload data to a bucket""" # Explicitly use service account credentials by specifying the private key # file. storage_client = storage.Client.from_service_account_json( 'creds.json') #print(buckets = list(storage_client.list_buckets()) bucket = storage_client.get_bucket(bucket_name) blob = bucket.blob(blob_name) blob.upload_from_filename(path_to_file) #returns a public url return blob.public_url
可以使用以下链接生成凭据文件: https://cloud.google.com/storage/docs/reference/libraries?authuser=1#client-libraries-install-python
异步示例:
import asyncio import aiohttp # pip install aiofile from aiofile import AIOFile # pip install gcloud-aio-storage from gcloud.aio.storage import Storage BUCKET_NAME = '<bucket_name>' FILE_NAME = 'requirements.txt' async def async_upload_to_bucket(blob_name, file_obj, folder='uploads'): """ Upload csv files to bucket. """ async with aiohttp.ClientSession() as session: storage = Storage(service_file='./creds.json', session=session) status = await storage.upload(BUCKET_NAME, f'{folder}/{blob_name}', file_obj) #info of the uploaded file # print(status) return status['selfLink'] async def main(): async with AIOFile(FILE_NAME, mode='r') as afp: f = await afp.read() url = await async_upload_to_bucket(FILE_NAME, f) print(url) # Python 3.6 loop = asyncio.get_event_loop() loop.run_until_complete(main()) # Python 3.7+ # asyncio.run(main())
导入 GoogleCloud 客户端库(需要 证件)
from google.cloud import storage import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="C:/Users/siva/Downloads/My First Project-e2d95d910f92.json"
实例化客户端
storage_client = storage.Client() buckets = list(storage_client.list_buckets()) bucket = storage_client.get_bucket("ad_documents") # your bucket name blob = bucket.blob('chosen-path-to-object/{name-of-object}') blob.upload_from_filename('D:/Download/02-06-53.pdf') print(buckets)
安装 Google 云存储 API 时:
pip install google-cloud
将抛出一个 ModuleNotFoundError:
ModuleNotFoundError
from google.cloud import storage ModuleNotFoundError: No module named 'google'
请确保按照 云存储客户端库文档:
pip install --upgrade google-cloud-storage
这个官方回购包含一些片段,演示了将文件上传到 bucket 的不同方法: https://github.com/googleapis/python-storage/tree/05e07f248fc010d7a1b24109025e9230cb2a7259/samples/snippets