如何在python 3中通过FTP发送StringIO?

时间:2015-05-26 04:03:32

标签: python python-3.x ftp stringio bytesio

我想通过FTP上传文本字符串作为文件。

public static class ClientEntriesExtension
{
   public static bool ExistEmail(this IEnumerable<ClientEntry> entries, string targetEmail)
   {
       return entries.Any(x=>x.ClientEmail == targetEmail);
   }
} 

bool exist = clientList.ExistEmail(targetEmail)

此代码返回错误:

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)

3 个答案:

答案 0 :(得分:1)

这可能是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)

答案 1 :(得分:1)

你也可以这样做

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)

答案 2 :(得分:0)

在python 3中为我工作。

content_json = bytes(json.dumps(content),"utf-8")
with io.StringIO(content_json) as fp:
    ftps.storlines("STOR {}".format(filepath), fp)