Как я могу отправить StringIO через FTP в Python 3?

Я хочу загрузить текстовую строку в виде файла через FTP.

import ftplib
from io import StringIO

file = StringIO()
file.write("aaa")
file.seek(0)


with ftplib.FTP() as ftp:
    ftp.connect("192.168.1.104", 2121)
    ftp.login("ftp", "ftp123")
    ftp.storbinary("STOR 123.txt", file)

Этот код возвращает ошибку:

TypeError: 'str' does not support the buffer interface

2 ответа

Это может привести к путанице в Python 3, тем более что такие инструменты, как csv буду только писать str, в то время как ftplib будет принимать только bytes,

Одним из способов решения этой проблемы является расширение io.BytesIO закодировать ваш str в bytes перед написанием:

import io
import ftplib

class StrToBytesIO(io.BytesIO):

    def write(self, s, encoding='utf-8'):
        return super().write(s.encode(encoding))

file = StrToBytesIO()
file.write("aaa")
file.seek(0)

with ftplib.FTP() as ftp:
    ftp.connect(host="192.168.1.104", port=2121)
    ftp.login(user="ftp", passwd="ftp123")

    ftp.storbinary("STOR 123.txt", file)

Вы также можете сделать это

binary_file = io.BytesIO()
text_file = io.TextIOWrapper(binary_file)

text_file.write('foo')
text_file.writelines(['bar', 'baz'])

binary_file.seek(0)
ftp.storbinary('STOR foo.txt', binary_file)

У меня работает в питоне 3.

content_json = bytes(json.dumps(content),"utf-8")
with io.StringIO(content_json) as fp:
    ftps.storlines("STOR {}".format(filepath), fp)
Другие вопросы по тегам