我正在读取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
我在做错了什么?请帮忙。
答案 0 :(得分:6)
shhdup的回答显示了如何正确地做到这一点,但没有解释你做错了什么。
您收到错误的实际原因是您要添加u"'"
unicode
对象和row[2]
,这是str
个对象。连接unicode
和str
(按任意顺序)会自动使用str
对sys.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