尝试上传带有unicode内容的XML时,Python ftplib UnicodeEncodeError

时间:2013-02-24 09:46:54

标签: python ftplib python-unicode

我正在尝试使用ftplib将带有unicode内容的XML上传到FTP服务器,但在尝试上传使用storbinary方法时遇到以下异常。 XML数据被正确编码为unicode(utf-8),我已经确定了,我不确定为什么storbinary在上传时会尝试将其编码为'ascii'。有人可以帮忙吗?


--> 429         ftp.storbinary("STOR file.xml", xml)
    430 
    431     def run(self):

/usr/lib/python2.7/ftplib.pyc in storbinary(self, cmd, fp, blocksize, callback, rest)
    463             buf = fp.read(blocksize)
    464             if not buf: break
--> 465             conn.sendall(buf)
    466             if callback: callback(buf)
    467         conn.close()

/usr/lib/python2.7/socket.pyc in meth(name, self, *args)
    222 
    223 def meth(name,self,*args):
--> 224     return getattr(self._sock,name)(*args)
    225 
    226 for _m in _socketmethods:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 3368: ordinal not in range(128)

2 个答案:

答案 0 :(得分:1)

您应该将以二进制模式打开的文件传递给ftp.storbinary()。例如,如果要将Unicode字符串上载为filename文件:

import io

assert isinstance(unicode_string, unicode)
file = io.BytesIO(unicode_string.encode("utf-8"))
ftp.storbinary("STOR filename", file)

如果unicode_string包含xml;确保xml声明中使用的字符编码与用于存储文件的编码一致。

答案 1 :(得分:0)

我能够找到解决方案,@ Cairnarvon的评论部分正确,我正在对字符串进行编码,但是还有其他位写入StringIO实例的未编码的字符串。最后,我最终创建了XML位并将其编码为一个整体。您可以在下面的pastebin链接中看到我的代码;

http://pastebin.com/GugTLRQJ