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)
我究竟做错了什么?请帮忙.
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'.
但是你的代码对于其中任何一个都不够重要.这些问题中的任何一个都不会给你带来的错误.
| 归档时间: |
|
| 查看次数: |
9656 次 |
| 最近记录: |