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]あるを追加しているためですstrunicodeaと a を(どちらの順序でも)連結すると、 usingがstr自動的にデコードされます。これはほとんど常にです。strsys.getdefaultencoding()'ascii'

この問題には 2 つの理由があります。まず、これ:

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 に答える