بايثون:كيفية الحصول على StringIO.writelines لقبول unicode السلسلة ؟
سؤال
أنا الحصول على
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)
على سلسلة المخزنة في'.desc' أدناه كما أنه يحتوي على '£' حرف.إنه الكامنة المخزنة في محرك جوجل التطبيق مخزن البيانات مثل سلسلة unicode فلا بأس.على cStringIO.StringIO.writelines وظيفة في محاولة على ما يبدو يحاول صياغته في شكل ascii:
result.writelines(['blahblah',a.desc,'blahblahblah'])
كيف يمكنني إرشاد إلى علاج ترميز unicode إذا كان هذا هو الصحيح والصياغة?
التطبيق محرك يعمل على بايثون 2.5
المحلول
وخلافا لملفات الذاكرة التي تنفذها وحدة StringIO، تلك التي توفرها [cStringIO] لم تكن قادرا على تقبل سلاسل Unicode التي لا يمكن المشفرة كسلاسل ASCII عادي.
اقتباس فقرة>وإذا كان ذلك ممكنا، استخدم StringIO بدلا من cStringIO.
نصائح أخرى
ويمكنك لف الكائن StringIO في كائن codecs.StreamReaderWriter
لترميز تلقائيا وفك الشفرة.
ومثل هذا:
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)
ويمكنك أيضا ترميز سلسلة الخاص بك ك UTF-8 يدويا قبل إضافتها إلى StringIO
for val in rows:
if isinstance(val, unicode):
val = val.encode('utf-8')
result.writelines(rows)
بيثون 2.6 قدم io
وحدة و يجب عليك النظر في استخدام io.StringIO()
, "،وهو في الذاكرة تيار نص unicode."
في السن إصدارات بيثون هذا ليس الأمثل (الثعبان النقي) في الإصدارات اللاحقة وقد تم تحسين (سريع) ج التعليمات البرمجية.