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

时间:2013-08-12 22:34:43

标签: 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()

我在文件中有一个单词: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
我在做错了什么?请帮忙。

2 个答案:

答案 0 :(得分:6)

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


您收到错误的实际原因是您要添加u"'" unicode对象和row[2],这是str个对象。连接unicodestr(按任意顺序)会自动使用strsys.getdefaultencoding()进行解码,'ascii'几乎始终为u"'" + row[2]+"'".encode('utf-8')

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

u"'" + row[2] + ("'".encode('utf-8'))

等同于:

(u"'" + row[2] + "'").encode('utf-8')

......而不是:

u"'" + row[2].encode('utf-8') + u"'"

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

("'" + row[2] + "'").encode('utf-8')

......或

encode

您还使用decode代替'utf-8'

即使你的数据是Latin-1,你也是'Latin-1'而不是{{1}}。

但是你的代码不足以让其中任何一个重要。这些问题都不会给你带来错误。

答案 1 :(得分:4)

uname =  ("'" + row[2]+"'").decode('utf-8') # Just that you need