1

我正在读取 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

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

4

2 回答 2

7

shhdup 的答案显示了如何正确执行此操作,但没有解释您做错了什么。


您收到错误的实际原因是您正在添加u"'",这是一个unicode对象,并且row[2],这是一个str对象。连接 aunicode和 a str(以任意顺序)会自动解码strusing sys.getdefaultencoding(),这几乎总是'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.

即使您的数据是Latin-1,您也不是'utf-8''Latin-1'

但是您的代码还远远不够重要。这些问题中的任何一个都不会给您带来您遇到的错误。

于 2013-08-12T22:59:15.563 回答
4
uname =  ("'" + row[2]+"'").decode('utf-8') # Just that you need
于 2013-08-12T22:37:34.820 回答