如何实现SFTP文件直传GCS?遇SFTPFile转Unicode错误求解决
解决SFTP文件直接上传Google Cloud Storage的错误
错误原因分析
你遇到的ValueError是因为两处参数使用错误:
bucket.blob()需要传入字符串类型的目标文件名(即文件在GCS存储桶中的名称),但你传入了paramiko.SFTPFile对象,导致类型转换失败。upload_from_filename()方法用于从本地文件路径读取文件上传,不能直接传入SFTP的文件流对象,应该使用upload_from_file()来处理流式上传。
修正后的代码
from google.cloud import storage import paramiko # 连接参数 host = 'host' port = 22 usr = 'me' pwd = '0123' sftp_file_path = './file.csv' gcs_target_filename = 'file.csv' # GCS存储桶中保存的文件名 bucket_name = 'the_bucket' # 建立SFTP连接(使用上下文管理器自动关闭连接) with paramiko.SSHClient() as sftp_client: sftp_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) sftp_client.connect(host, port, usr, pwd) with sftp_client.open_sftp() as sftp: # 打开SFTP上的文件(二进制读模式) with sftp.open(sftp_file_path, 'rb') as sftp_file: # 初始化GCS客户端并上传文件流 storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(gcs_target_filename) # 直接从SFTP文件流上传到GCS blob.upload_from_file(sftp_file)
关键修改点
- 给
bucket.blob()传入明确的字符串文件名gcs_target_filename,指定文件在GCS中的存储名称。 - 使用
upload_from_file()替代upload_from_filename(),直接读取SFTP的文件流完成上传,无需本地保存文件。 - 嵌套使用
with上下文管理器,确保SFTP连接、文件对象能自动关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Maximuluss
相关产品推荐
相关产品推荐

