You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python在不写入文件系统的情况下将Google Cloud Storage数据传输至SFTP

直接流传输GCS Blob到SFTP(绕过本地文件系统)

核心思路

利用Google Cloud Storage的download_to_fileobj方法将Blob内容直接写入SFTP的远程文件流中,完全跳过本地磁盘读写,既适配Google Cloud Functions的只读文件系统,又能提升传输效率。

修改后的代码示例

from google.cloud import storage
import pysftp

# 保留你原有的初始化逻辑
storage_client = storage.Client()
bucket = storage_client.get_bucket("你的存储桶名称")
prefix = "你的Blob前缀路径"
cnopts = pysftp.CnOpts()
# 生产环境建议保留主机密钥验证,测试场景可临时设置:cnopts.hostkeys = None

# 建立SFTP连接并直接流式传输
with pysftp.Connection(Config.SFTP_HOST, port=Config.SFTP_PORT, username=Config.SFTP_USER, password=Config.SFTP_PWD, cnopts=cnopts) as sftp:
    for blob in storage_client.list_blobs(bucket, prefix=prefix):
        # 生成远程SFTP目标路径(复用你原有的路径处理逻辑)
        remote_path = remove_prefix(blob.name, prefix)
        
        # 确保远程目录存在(如果Blob路径包含子目录)
        if "/" in remote_path:
            remote_dir = remote_path.rsplit("/", 1)[0]
            try:
                sftp.makedirs(remote_dir)
            except OSError:
                # 目录已存在时忽略异常
                pass
        
        # 直接将Blob内容流式写入远程SFTP文件
        with sftp.open(remote_path, 'wb') as remote_file:
            blob.download_to_fileobj(remote_file)
        print(f"传输完成: {blob.name} -> {remote_path}")

关键说明

  • 流传输逻辑:download_to_fileobj支持将Blob内容写入任何实现write方法的类文件对象,这里直接传入SFTP的远程文件句柄,实现端到端的无磁盘传输。
  • 目录兼容:如果你的Blob路径包含多级目录结构,必须先创建对应的远程目录,否则会因目录不存在导致上传失败。
  • 性能提升:跳过本地磁盘IO后,传输速度会明显加快,尤其适合大文件或批量文件的传输场景。

内容的提问来源于stack exchange,提问作者Titu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:48:15