2016-12-21 20 views
0

をデコードすることができない私は、HTMLフォーム経由でアップロードしていCSVファイルを持っているのPython APIへUnicodeDecodeError: 'UTF8' コーデックがバイト0xea

APIは、次のようになります。

@app.route('/add_candidates_to_db', methods=['GET','POST']) 
def add_candidates(): 
    file = request.files['csv_file'] 
    x = io.StringIO(file.read().decode('UTF8'), newline=None) 
    csv_input = csv.reader(x) 
    for row in csv_input: 
     print(row) 

私は問題の原因となっているファイルの部分を見つけました。私のファイルにはÍ文字があります。

私はこのエラーを取得する:UnicodeDecodeError: 'utf8' codec can't decode byte 0xea in position 1317: invalid continuation byte

私は.decode('UTF8')でそれを復号化したか、エラーがfile.read()とその前に起こっていると思いましたか?

これを修正するにはどうすればよいですか?

** **

編集:私は、ファイルのコントロールを持っています。私は自分自身でCSVファイルを作成しています(時にはこのデータには奇妙な文字があります)。

サーバー側では、ファイルの各行を読み込んでデータベースに挿入しています。

+2

utf8が有効ではないことを伝えています。これを修正するには、有効なutf8を使用してください。 – pvg

+0

ああ、utf8にはデコードできないと言っているのは、それが有効なutf8文字ではないからです。 –

+0

右。このような質問のために、Pythonのバージョンを投稿すると便利です。これはPython 2のようです。 – pvg

答えて

-1

あなたのファイルはutf8でエンコードされていないようです。 all the encodings that Python understandでファイルを読み込み、ファイルの内容全体を読むことができます。このスクリプトを試してください:

from codecs import open 

encodings = [ 
    "ascii", 
    "big5", 
    "big5hkscs", 
    "cp037", 
    "cp424", 
    "cp437", 
    "cp500", 
    "cp720", 
    "cp737", 
    "cp775", 
    "cp850", 
    "cp852", 
    "cp855", 
    "cp856", 
    "cp857", 
    "cp858", 
    "cp860", 
    "cp861", 
    "cp862", 
    "cp863", 
    "cp864", 
    "cp865", 
    "cp866", 
    "cp869", 
    "cp874", 
    "cp875", 
    "cp932", 
    "cp949", 
    "cp950", 
    "cp1006", 
    "cp1026", 
    "cp1140", 
    "cp1250", 
    "cp1251", 
    "cp1252", 
    "cp1253", 
    "cp1254", 
    "cp1255", 
    "cp1256", 
    "cp1257", 
    "cp1258", 
    "euc_jp", 
    "euc_jis_2004", 
    "euc_jisx0213", 
    "euc_kr", 
    "gb2312", 
    "gbk", 
    "gb18030", 
    "hz", 
    "iso2022_jp", 
    "iso2022_jp_1", 
    "iso2022_jp_2", 
    "iso2022_jp_2004", 
    "iso2022_jp_3", 
    "iso2022_jp_ext", 
    "iso2022_kr", 
    "latin_1", 
    "iso8859_2", 
    "iso8859_3", 
    "iso8859_4", 
    "iso8859_5", 
    "iso8859_6", 
    "iso8859_7", 
    "iso8859_8", 
    "iso8859_9", 
    "iso8859_10", 
    "iso8859_13", 
    "iso8859_14", 
    "iso8859_15", 
    "iso8859_16", 
    "johab", 
    "koi8_r", 
    "koi8_u", 
    "mac_cyrillic", 
    "mac_greek", 
    "mac_iceland", 
    "mac_latin2", 
    "mac_roman", 
    "mac_turkish", 
    "ptcp154", 
    "shift_jis", 
    "shift_jis_2004", 
    "shift_jisx0213", 
    "utf_32", 
    "utf_32_be", 
    "utf_32_le", 
    "utf_16", 
    "utf_16_be", 
    "utf_16_le", 
    "utf_7", 
    "utf_8", 
    "utf_8_sig", 
] 

for encoding in encodings: 
    try: 
     with open(file, encoding=encoding) as f: 
      f.read() 
     print('Seemingly working encoding: {}'.format(encoding)) 
    except: 
     pass 

ここで、fileは再びファイルのファイル名です。

+0

すべてのシングルバイトエンコーディング(すべての' cp *と 'iso8859 *'エンコーディング)はエラーなしでファイルを読むことができますが、ファイルが正しい文字にデコードされたかどうかを調べるために、結果を調べなければなりません。 – jwodder

+0

これは合理的な答えではありません。エンコードの検出を試みるより良い方法があります。 – pvg

+0

それゆえ、「一見して働いている」という表現。スクリプトは、エラーをスローしないエンコーディングを検出します。指定されたエンコーディングが実際に正しく機能するという保証はありません。 –

1

あなたのデータはUTF-8ではなく、エラーが含まれています。あなたはデータを生成していると言います。理想的な解決策は、より良いデータを生成することです。

残念ながら、高品質のデータを取得できない場合や、ごみを提供するサーバーがあり、それを並べ替える必要があります。このような状況では、テキストをデコードする際にあまり厳密なエラー処理を使用することはできません。

の代わりに:

あなたが使用することができます
file.read().decode('UTF8') 

file.read().decode('UTF8', 'replace') 

任意の「ゴミ」の文字(正しくUTF-8としてエンコードされていないもの)を取得するように、これはそれを作るだろう次のようなU + FFFDに置き換えられます。

あなたのファイルにはÍ文字ですが、UTF-8以外のエンコーディングを使用している可能性があります。ファイルは、にはÍが含まれていますか、それともちょうどmojibakeですか?たぶんキャラクターがどんなものであるべきかを理解することができます。それでUTF-8でない場合にあなたのデータが使用するエンコーディングを知ることができます。

+0

これは、少なくとも文字エンコーディングを決定しようとするツールがあり、それらはしばしばかなり効果的であることを指摘することなく、素晴らしい答えではありません。それが現れて、あなたの答えは基本的に「データを捨てる」ことです。これは本当に必要ではありません。 – pvg

+0

@pvg:それは素晴らしい貢献です。 「編集」ボタンをクリックしてください。 –

関連する問題