2

私はpython3.3とsqlite3データベースを使用しています。Windows7のワードパッドで開くことができる、約270MBの大きなテキストファイルがあります。

そのファイルの各行は次のようになります。

ターム \t 番号\n

すべての行を読み取り、値をデータベースに保存したいと考えています。私のコードは次のようになります。

f = open('sorted.de.word.unigrams', "r")
for line in f:

    #code

すべてのデータをデータベースに読み込むことができましたが、特定の行だけに、おそらくすべての行の半分をお勧めします。次に、次のエラーが表示されます。

File "C:\projects\databtest.py", line 18, in <module>
for line in f:
File "c:\python33\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 140: character maps to   <undefined>

encoding = utf-8 でファイルを開こうとしましたが、他のコーデックでも何も機能しませんでした。次に、utf-8 txtファイルとして保存してワードパッドでコピーを作成しようとしました。しかし、ワードパッドがクラッシュしました。

ここで問題はどこにありますか。その行には、python が処理できない文字があるようです。ファイルを完全に読み取るにはどうすればよいですか? または、そのようなエラー メッセージを無視して、次の行に進むことは可能でしょうか?

パックされたファイルは次の場所からダウンロードできます。

http://wacky.sslmit.unibo.it/lib/exe/fetch.php?media=frequency_lists:sorted.de.word.unigrams.7z

どうもありがとう!

4

3 に答える 3

5

ファイルを確認したところ、問題の根本原因は、ファイルに少なくとも 2 つのエンコーディング (おそらく cp1252 と cp850) の単語が含まれていることです。文字 0x81 はücp850 にありますが、cp1252 では定義されていません。例外をキャッチすることでその状況を処理できますが、他の一部のドイツ語文字は cp1252 で有効だが間違った文字にマップされます。このような不完全な解決策に満足している場合は、次の方法で解決できます。

with open('sorted.de.word.unigrams','rb') as f: #open in binary mode
    for line in f:
        for cp in ('cp1252', 'cp850'):
            try:
                s = line.decode(cp)
            except UnicodeDecodeError:
                pass
            else:
                store_to_db(s)
                break
于 2013-09-06T09:13:03.403 に答える
2

encodingこれは通常、ミスマッチがある場合に発生します。

0x81意味がないので、エンコーディングを指定してみてください

file = open(filename, encoding="utf8")
于 2016-07-01T10:07:14.787 に答える
1

試す

data = []
import codecs
with codecs.open('sorted.de.word.unigrams', 'r') as f:
    for line in f:
         data.append(line)

エラーを無視したい場合は、次のことができます

try:
    # Your code that enter data to database
except UnicodeDecodeError:
    pass
于 2013-09-06T01:55:49.137 に答える