pysftp putfo создает пустой файл на SFTP-сервере, но не передает содержимое из StringIO - PullRequest
1 голос
/ 17 октября 2019

Мой код сначала записывает строки в CSV в io.StringIO():

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

Я также могу успешно подключиться кSFTP-сервер, использующий pysftp и даже с помощью 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-сервер?

1 Ответ

1 голос
/ 17 октября 2019

Вы должны искать указатель чтения буфера обратно в начало, прежде чем пытаться загрузить буфер:

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=',') 
    # ...

Подобный вопрос с отображением хода выполнения см .:
Как использовать Paramiko getfo для загрузки файла с SFTP-сервера в память для его обработки

...