【问题标题】:Upload a folder to Google Cloud Storage with Python?使用 Python 将文件夹上传到 Google Cloud Storage?
【发布时间】:2019-11-07 14:24:04
【问题描述】:

我找到了upload_from_file和upload_from_filename,但是有没有通过Python将整个文件夹上传到Cloud Storage的函数或方法?

【问题讨论】:

  • 是的,在 Python 中循环遍历目录中的每个文件条目并上传每个文件。
  • 谢谢!这是我暂时的解决方法。

标签: python directory google-cloud-platform upload


【解决方案1】:

这对我有用。将所有内容从本地目录复制到谷歌云存储中的特定存储桶名称/完整路径(递归):

import glob
from google.cloud import storage
import os

def upload_local_directory_to_gcs(local_path, bucket, gcs_path):
    assert os.path.isdir(local_path)
    for local_file in glob.glob(local_path + '/**'):
        if not os.path.isfile(local_file):
           upload_local_directory_to_gcs(local_file, bucket, gcs_path + "/" + os.path.basename(local_file))
    else:
        remote_path = os.path.join(gcs_path, local_file[1 + len(local_path):])
        blob = bucket.blob(remote_path)
        blob.upload_from_filename(local_file)


upload_local_directory_to_gcs(local_path, bucket, BUCKET_FOLDER_DIR)

【讨论】:

  • 非常感谢!我会试试这个。
  • “else”语句的缩进有问题。应该向右移动
【解决方案2】:

我不直接在 Python API 中思考,不,但是在命令行工具gsutil 中有。只要您在调用 Python 的 shell 中的命令行上通过了身份验证,就可以从 python 脚本进行系统调用以调用 gsutil 工具。

命令看起来像:

gsutil -m cp -r <foldername> gs://<bucketname>

【讨论】:

  • 非常感谢!我会调查一下,让你知道它是怎么回事。
【解决方案3】:

Google Cloud Storage 并没有真正的“目录”概念,只有二进制 blob(如果您以这种方式命名它们,它们的键名可能有点像目录)。所以你目前在 Python 中的方法是合适的。

【讨论】:

    【解决方案4】:

    这是对@Maor88 提供的答案的改进

    这个函数可以用来上传文件或目录到gcs。

    from google.cloud import storage
    import os
    import glob
    
    
    def upload_to_bucket(src_path, dest_bucket_name, dest_path):
            bucket = storage_client.get_bucket(dest_bucket_name)
            if os.path.isfile(src_path):
                blob = bucket.blob(os.path.join(dest_path, os.path.basename(src_path)))
                blob.upload_from_filename(src_path)
                return
            for item in glob.glob(src_path + '/*'):
                if os.path.isfile(item):
                    blob = bucket.blob(os.path.join(dest_path, os.path.basename(item)))
                    blob.upload_from_filename(item)
                else:
                    upload_to_bucket(item, dest_bucket_name, os.path.join(dest_path, os.path.basename(item)))
    

    【讨论】:

    • 如果文件存在于 gcs 中,我如何通过添加条件来做到这一点,然后跳过
    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2014-11-22
    • 2020-06-13
    • 2014-01-05
    • 2014-10-25
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多