python-3.x pysftp putfo在SFTP服务器上创建一个空文件,但不从StringIO流式传输内容

kyvafyod  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(116)

我的代码首先将行写入io.StringIO()中的CSV:

fileBuffer = io.StringIO()

# write header
header_writer = csv.DictWriter(fileBuffer, fieldnames=columnNames)
header_writer.writeheader()

# write lines
writer = csv.writer(fileBuffer, delimiter=',') 

for line in data:
            line_dec = line.decode('ISO-8859-1') 
            # print([line_dec])
            writer.writerow([line_dec])

下列程式码也会打印所有预期的数据列:

$print(fileBuffer.getvalue())    # -> prints all expected rows

我还可以使用pysftp成功连接到SFTP服务器,甚至在中,使用pysftp时,代码也成功返回所有预期的行:

with pysftp.Connection(host, username=user, password=pw, cnopts=cnopts) as sftp: 
            print('sucessfully connected to {} via Port 22'.format(host))
            print(fileBuffer.getvalue())    # -> prints all expected rows
            sftp.putfo(fileBuffer, file2BeSavedAs)   # -> no rows put on FTP Server

真正的问题来了

不幸的是,代码只创建了文件,而没有将数据和主体分别写入其中。另一方面,我的代码没有返回任何错误消息。

如何将CSV从StringIO放到SFTP服务器?

fnx2tebb

fnx2tebb1#

在尝试上传缓冲区之前,必须将缓冲区的读指针返回到起始位置:

fileBuffer.seek(0)
sftp.putfo(fileBuffer, file2BeSavedAs)

不过更好的方法是直接将CSV写入服务器,而不需要中间缓冲区。使用Connection.open获取一个类似文件的对象,表示SFTP服务器上的文件:

with sftp.open(file2BeSavedAs, mode='w', bufsize=32768) as f:
    writer = csv.writer(f, delimiter=',') 
    # ...

有关bufsize参数的用途,请参阅:
Writing to a file on SFTP server opened using Paramiko/pysftp "open" method is slow
有关具有进度显示的类似问题,请参阅:
How to use Paramiko getfo to download file from SFTP server to memory to process it
虽然pysftp已经死了。你最好使用Paramiko。参见pysftp vs. Paramiko。使用Paramiko的代码几乎是一样的。

相关问题