如何用Python(pysftp)不加载内存从GCS传大Zip至SFTP(非Cloud Function)
问题解答
关于GCS文件的系统路径
不能获取GCS文件的系统路径。GCS是云对象存储服务,gs://开头的路径只是对象的标识,并非本地文件系统的真实路径,所以pysftp.put()无法直接识别这类路径。
可行的传输方法
方法1:流式分块传输(推荐)
通过Google Cloud Storage SDK获取文件的流式对象,分块读取并写入SFTP服务器,全程不会将整个文件加载到内存。
示例代码:
from google.cloud import storage import pysftp # 初始化GCS客户端 storage_client = storage.Client() bucket = storage_client.bucket("你的GCS桶名称") gcs_blob = bucket.blob("桶内zip文件的路径") # SFTP连接配置 cnopts = pysftp.CnOpts() # 生产环境建议保留主机密钥验证,测试环境可临时设置cnopts.hostkeys = None with pysftp.Connection(host="SFTP服务器地址", username="test", password="test", cnopts=cnopts) as sftp: sftp.cwd("/tmp") # 打开远程SFTP文件准备写入 with sftp.open("远程服务器保存的文件名.zip", "wb") as remote_file: # 分块传输,chunksize可根据服务器性能调整(示例为10MB) gcs_blob.download_to_file(remote_file, chunksize=10 * 1024 * 1024)
方法2:将GCS挂载为本地文件系统
使用gcsfuse工具将GCS桶挂载到本地机器的文件系统,这样就能像操作本地文件一样用pysftp.put()传输。
操作步骤:
- 在运行代码的机器上安装
gcsfuse - 创建本地挂载目录并挂载GCS桶:
mkdir ~/gcs-mount gcsfuse 你的GCS桶名称 ~/gcs-mount - 修改代码使用本地挂载路径:
with pysftp.Connection(host="SFTP服务器地址", username='test', password='test', cnopts=cnopts) as sftp: sftp.cwd("/tmp") # 直接使用挂载后的本地路径 sftp.put("/home/你的用户名/gcs-mount/桶内zip文件的路径")
注意:这种方法需要维护挂载的稳定性,且依赖机器上的gcsfuse环境,适合固定机器部署的场景。
内容的提问来源于stack exchange,提问作者PROTOCOL
相关产品推荐
相关产品推荐

