pysftp putfo 在 SFTP 服务器上创建一个空文件,但不流式传输来自 StringIO 的内容
pysftp putfo creates an empty file on SFTP server but not streaming the content from StringIO
我的代码首先将行写入 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 时代码成功 returns 所有预期的行:
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
实际问题来了:
不幸的是,代码只创建了文件,而没有分别将数据和主体写入其中。另一方面,我的代码没有 return 任何错误消息。
如何将 CSV 从 StringIO
传送到 SFTP 服务器?
在尝试上传缓冲区之前,您必须找到缓冲区的读指针回到开头:
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 pysftp "open" method is slow
类似问题,有进度显示,见:
我的代码首先将行写入 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 时代码成功 returns 所有预期的行:
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
实际问题来了:
不幸的是,代码只创建了文件,而没有分别将数据和主体写入其中。另一方面,我的代码没有 return 任何错误消息。
如何将 CSV 从 StringIO
传送到 SFTP 服务器?
在尝试上传缓冲区之前,您必须找到缓冲区的读指针回到开头:
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 pysftp "open" method is slow
类似问题,有进度显示,见: