我正在从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
我做错了什么?请帮忙。
shhdup的回答显示了如何正确地做到这一点,但没有解释你做错了什么。
您
收到错误的实际原因是您正在添加 u"'"
,这是一个unicode
对象,row[2]
,这是一个str
对象。连接unicode
和str
(按任一顺序(使用sys.getdefaultencoding()
自动解码str
,这几乎总是'ascii'
。
此问题有两个原因。首先,这个:
u"'" + row[2]+"'".encode('utf-8')
相当于这个:
u"'" + row[2] + ("'".encode('utf-8'))
。而不是:
(u"'" + row[2] + "'").encode('utf-8')
但是,即使您修复了这个问题,您仍然会在参数中将 Unicode 和字节字符串一起添加。所以你要么想要这个:
u"'" + row[2].encode('utf-8') + u"'"
。或
("'" + row[2] + "'").encode('utf-8')
您还使用encode
而不是decode
。
而且,即使您的数据是拉丁语-1,您也是'utf-8'
而不是'Latin-1'
。
但是你的代码还不够远,以至于其中任何一个都很重要。这些问题都不会给你带来的错误。
uname = ("'" + row[2]+"'").decode('utf-8') # Just that you need