Python:如何让 StringIO.writelines 接受 unicode 字符串?
题
我得到了一个
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)
在下面存储在“a.desc”中的字符串上,因为它包含“£”字符。它作为 unicode 字符串存储在底层 Google App Engine 数据存储中,所以没问题。cStringIO.StringIO.writelines 函数似乎正在尝试将其编码为 ascii 格式:
result.writelines(['blahblah',a.desc,'blahblahblah'])
如果这是正确的措辞,我如何指示它将编码视为 unicode?
应用程序引擎在 python 2.5 上运行
解决方案
与 StringIO 模块实现的内存文件不同,[cStringIO] 提供的内存文件无法接受无法编码为纯 ASCII 字符串的 Unicode 字符串。
如果可能,请使用 StringIO 而不是 cStringIO。
其他提示
您可以将 StringIO 对象包装在 codecs.StreamReaderWriter
自动编码和解码 unicode 的对象。
像这样:
import cStringIO, codecs
buffer = cStringIO.StringIO()
codecinfo = codecs.lookup("utf8")
wrapper = codecs.StreamReaderWriter(buffer,
codecinfo.streamreader, codecinfo.streamwriter)
wrapper.writelines([u"list of", u"unicode strings"])
buffer
将用 utf-8 编码字节填充。
如果我正确理解你的情况,你只需要写,所以你也可以这样做:
import cStringIO, codecs
buffer = cStringIO.StringIO()
wrapper = codecs.getwriter("utf8")(buffer)
您还可以在将字符串添加到 StringIO 之前手动将其编码为 utf-8
for val in rows:
if isinstance(val, unicode):
val = val.encode('utf-8')
result.writelines(rows)
Python 2.6 引入了 io
模块,你应该考虑使用 io.StringIO()
, ,“unicode 文本的内存流。”
在旧的 python 版本中,这没有优化(纯 Python),在更高的版本中,这已经优化为(快速)C 代码。
不隶属于 StackOverflow