Python 2.7 UnicodeDecodeError:'ascii'编解码器无法解码字节

gil*_*ipf 4 python unicode

我一直在解析一些带有特殊字符(捷克语字母)的docx文件(UTF-8编码的XML).当我尝试输出到stdout时,一切顺利,但我无法将数据输出到文件,

回溯(最近一次调用最后一次):
文件"./test.py",第360行,
inile.write(u'\ t\t\t\t\t\t \n \n')
UnicodeEncodeError:'ascii'编解码器不能编码位置37的字符u'\ xed':序数不在范围内(128)

虽然我明确地将word变量转换为unicode类型(type(word)返回unicode),但我试图对它进行编码,.encode('utf-8)我仍然坚持这个错误.

以下是现在看到的代码示例:

for word in word_list:
    word = unicode(word)
    #...
    ofile.write(u'\t\t\t\t\t<feat att="writtenForm" val="'+word+u'"/>\n')
    #...
Run Code Online (Sandbox Code Playgroud)

我也尝试过以下方法:

for word in word_list:
    word = word.encode('utf-8')
    #...
    ofile.write(u'\t\t\t\t\t<feat att="writtenForm" val="'+word+u'"/>\n')
    #...
Run Code Online (Sandbox Code Playgroud)

即使是这两者的组合:

word = unicode(word)
word = word.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

我有点绝望,所以我甚至试图编码里面的单词变量 ofile.write()

ofile.write(u'\t\t\t\t\t<feat att="writtenForm" val="'+word.encode('utf-8')+u'"/>\n')
Run Code Online (Sandbox Code Playgroud)

我很欣赏任何我做错的提示.

phi*_*hag 11

ofile是一个字节流,你正在写一个字符串.因此,它会尝试通过编码为字节字符串来处理您的错误.这通常只对ASCII字符安全.由于word包含非ASCII字符,因此失败:

>>> open('/dev/null', 'wb').write(u'ä')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 0:
                    ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

ofile用打开文件的文本流io.open,具有模式一样'wt',而在明确编码:

>>> import io
>>> io.open('/dev/null', 'wt', encoding='utf-8').write(u'ä')
1L
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用codecs.open几乎相同的界面,或手动编码所有字符串encode.