2017-04-08 4 views
0

私はutf-8でエンコードされたpostgresdwhにデータを読み込みます。これには、姓、名、住所などの個人情報が含まれています。これらの値は、umlautsなどのドイツ語の文字と、é, â, àなどのフランス語の文字を持つことができます。データはExcelファイルからデータフレームに読み込まれ、postgresqlデータベースにプッシュされます。 私はこれまで、次の行を使用してエンコードエラーを回避してきました。だから、最初の名前値のインスタンスのために:私は今、別のエラーを調達しているフランス語の文字遭遇したPythonエンコーディングの人物名

df = pd.read_excel(dir_path, encoding='utf-8-sig') 

df['fname'] = df['fname'].apply(lambda x: x.encode('windows-1252')) 

df['fname'] = df['fname'].apply(lambda x: x.encode('utf-8-sig')) 

DataError('(psycopg2.DataError) invalid byte sequence for encoding "UTF8": 0xe9 0x20 0x20 

を私がするエンコーディングを変更しましたただし、スクリプトをそのままにしておくと、ドイツ語の文字で値が読み込まれることはありません。 私はwindows-1252がWester-European言語で使用されていると考えており、これらのすべての特殊文字を処理できるはずです。 これらの言語すべてに適用される代替エンコードはありますか?または、処理された値に基づいてエンコーディングを変更する必要がありますか? 「無効なバイトシーケンス」問題は間違いなくデータがをエンコードされていない、を復号化された場所に接続されている:DataErrorはどこから来たあなたは一つのことが明確である、表示されませんが

+0

質問を編集して、**対応する**コード行を** DataError(** ** Read、[最小、完全、および検証可能な例を作成する方法[1]]に応じて編集し、それに応じて質問を編集してください。 [1]:https://stackoverflow.com/help/mcve – stovfl

答えて

1

したがって、表示する2行がエンコードに関連するすべてのものである場合、例外は最初のもの(pd.read_excel)で発生します。 をエンコードすると、(ラムダ式の)2番目の行と同様に、無効なバイトシーケンスに関連する問題は発生しません。

明らかに、入力がではなく、UTF-8でエンコードされた(BOMありまたはなし)です。 確認:実際のエンコーディングの指定された情報(フランス語とドイツ語の文字、シーケンスb'\xe9\x20\x20'、Windowsの場合)、良い推測に基づくしかし

>>> b'\xe9\x20\x20'.decode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 0: invalid continuation byte 

は、CP-1252またはラテン9(ISO 8859-15)です。それらの両方で、結果は同じである:それはすべての入力のために動作しない場合

df = pd.read_excel(dir_path, encoding='windows-1252') 

は、おそらくエンコーディングをparametriseする必要がありますと:だから

>>> b'\xe9\x20\x20'.decode('cp1252') 
'é ' 
>>> b'\xe9\x20\x20'.decode('latin9') 
'é ' 

、これを試してみてください入力ファイルごとにそれに応じて設定してください。

関連する問題