python德语变音问题 - 'ascii'编解码器无法解码位置15的字节0xe4:顺序不在范围内(128)

don*_*yor 0 python django encoding utf-8

我正在读取csv文件并将数据保存到我的模型中.

with open(settings.MEDIA_ROOT + '\\f.csv', 'rb') as f:
    reader = csv.reader(f,delimiter=';')
    for row in reader:
        uname =  u"'" + row[2]+"'".encode('utf-8')
        u = University(name=uname)
        u.save()
Run Code Online (Sandbox Code Playgroud)

我在文件中有一个单词:Westfälisch.这是代码卡住的词.

这是错误消息:

'ascii' codec can't decode byte 0xe4 in position 15: ordinal not in range(128)

The string that could not be encoded/decoded was: Westf?lisch
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?请帮忙.

aba*_*ert 6

shhdup的答案显示了如何正确地做到这一点,但没有解释你做错了什么.


你得到错误的实际原因是你要添加u"'",这是一个unicode对象,而且row[2]是一个str对象.连接a unicode和a str(以任意顺序)自动解码str使用sys.getdefaultencoding(),这几乎总是如此'ascii'.

这个问题有两个原因.首先,这个:

u"'" + row[2]+"'".encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

相当于:

u"'" + row[2] + ("'".encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

… 而不是:

(u"'" + row[2] + "'").encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

但是,即使你修复了这个问题,你仍然会在parens中添加Unicode和字节字符串.所以你要么想要这个:

u"'" + row[2].encode('utf-8') + u"'"
Run Code Online (Sandbox Code Playgroud)

… 要么

("'" + row[2] + "'").encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

你也用encode而不是decode.

即使你的数据是Latin-1 ,你也可以'utf-8'代替'Latin-1'.

但是你的代码对于其中任何一个都不够重要.这些问题中的任何一个都不会给你带来的错误.