我正在尝试使用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)
答案 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链接中看到我的代码;