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

如何将列表数据写入临时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:10:33