如何将列表数据写入临时CSV文件并上传至SFTP服务器
解决SFTP上传空CSV文件的问题
问题根源
你的代码写入CSV内容后直接调用sftp.put,但此时文件对象的缓冲区内容还未同步到磁盘,SFTP上传的是磁盘上的空文件,最终导致文件大小为0字节。
解决方案
提供两种可靠的处理方式:
方式1:关闭临时文件后再上传
写入完成后关闭文件,确保缓冲区内容写入磁盘,再执行上传操作:
import paramiko import tempfile import csv import os # 建立并打开SFTP连接的代码部分 TheList = [['name', 'address'], ['peter', 'london']] with tempfile.NamedTemporaryFile(suffix='.csv', mode='w', delete=False) as csvfile: filewriter = csv.writer(csvfile) filewriter.writerows(TheList) # 上下文管理器自动关闭文件,内容已写入磁盘 sftp.put(csvfile.name, SftpPath + "anewfile.csv") # 上传完成后删除临时文件(可选) os.unlink(csvfile.name) # 关闭SFTP连接的代码部分
方式2:内存中生成CSV直接上传(无需临时文件)
用io.StringIO在内存中生成CSV内容,直接通过文件对象上传,省去磁盘IO操作,更高效:
import paramiko import csv from io import StringIO # 建立并打开SFTP连接的代码部分 TheList = [['name', 'address'], ['peter', 'london']] csv_buffer = StringIO() filewriter = csv.writer(csv_buffer) filewriter.writerows(TheList) # 将缓冲区指针移到开头,确保SFTP能读取全部内容 csv_buffer.seek(0) # 使用putfo上传文件对象 sftp.putfo(csv_buffer, SftpPath + "anewfile.csv") # 关闭SFTP连接的代码部分
关键说明
- 方式1中,
with上下文管理器会自动关闭文件,强制将缓冲区内容写入磁盘;若不用with,需手动调用csvfile.close()后再上传。 - 方式2避免了临时文件的创建,适合小数据量场景,减少磁盘操作开销,注意上传前必须调用
seek(0)重置文件指针到起始位置。
内容的提问来源于stack exchange,提问作者Gamsner
相关产品推荐
相关产品推荐

