Python通过paramiko SFTP获取文件并存储到本地变量的实现方法
解决方案
核心实现思路是直接读取SFTP返回的文件流到内存,无需落地到本地磁盘,两种常用实现方式如下:
方式1:直接将CSV内容存为字符串变量
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='xxx', port='xx', username='xxx', password='xxx', allow_agent=False, look_for_keys=False) sftp = client.open_sftp() # 直接读取远程文件内容到CurFile变量 with sftp.open('AJTESTFILE.csv', 'r', encoding='utf-8') as fl: CurFile = fl.read() sftp.close() client.close()
此时CurFile就是完整的CSV文件字符串内容,可直接后续处理。
方式2:直接对接现有CSV修改逻辑,无需存本地文件
如果你不需要单独存原始CSV字符串,要直接做内容替换,可直接把SFTP返回的文件流传给csv.reader:
import paramiko import csv import io client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='xxx', port='xx', username='xxx', password='xxx', allow_agent=False, look_for_keys=False) sftp = client.open_sftp() new_rows = [] changes = { 'vehicle_id': 'stock number', 'vin': 'vehicle_id', } # 直接读远程文件流做处理,不需要写入本地磁盘 with sftp.open('AJTESTFILE.csv', 'r', encoding='utf-8') as fl: reader = csv.reader(fl) for row in reader: new_row = row for key, value in changes.items(): new_row = [x.replace(key, value) for x in new_row] new_rows.append(new_row) # 若需要把修改后的CSV内容也存在变量中(用于后续上传谷歌表格),可借助StringIO实现 output_obj = io.StringIO() writer = csv.writer(output_obj) writer.writerows(new_rows) modified_csv = output_obj.getvalue() # 修改后的完整CSV字符串 output_obj.close() sftp.close() client.close()
原有代码错误说明
你之前调用sftp.getfo('AJTESTFILE.csv', fl='curFile', ...)写法有误,getfo的第二个参数需要传入可写的类文件对象,不是字符串格式的变量名,如果你要用getfo实现可以这么写:
import io import paramiko # 连接逻辑省略 sftp = client.open_sftp() cur_file = io.BytesIO() sftp.getfo('AJTESTFILE.csv', fl=cur_file) cur_file.seek(0) # 重置文件指针到开头才能读取内容 csv_content = cur_file.read().decode('utf-8')
内容的提问来源于stack exchange,提问作者user9627263
相关产品推荐
相关产品推荐

