2017-04-08 2 views
0

Je charge des données dans un postgresdwh encodé à utf-8 qui inclut des informations personnelles - y compris le prénom, le nom et les adresses. Ces valeurs peuvent avoir des caractères allemands tels que umlauts ainsi que des caractères français tels que é, â, à etc. Les données sont lues à partir de fichiers Excel, dans une base de données, puis insérées dans la base de données postgresql. J'ai déjà utilisé la ligne suivante pour contourner une erreur d'encodage. Ainsi, par exemple sur les valeurs du premier nom:Python Codage des noms de personnes

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

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

J'ai maintenant rencontré des personnages français qui ont soulevé une autre erreur:

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

J'ai changé l'encodage à:

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

Cependant, laisser le script tel quel ne chargera pas les valeurs avec des caractères allemands. Je pensais que windows-1252 est utilisé pour les langues Wester-European et devrait être capable de traiter tous ces caractères spéciaux. Existe-t-il un codage alternatif qui s'appliquera à toutes ces langues? Ou dois-je changer l'encodage en fonction de la valeur traitée?

+0

Veuillez modifier votre question pour afficher la ligne de code ** correspondante ** à ** DataError ('**. Lire, [Comment créer un exemple minimal, complet et vérifiable] [1] et éditer votre question en conséquence. [1]: https://stackoverflow.com/help/mcve – stovfl

Répondre

1

Même si vous ne vous présentez pas où l'DataError vient, une chose est claire: un problème « séquence d'octets non valide » est certainement connecté à un emplacement où les données sont décodées , non encodées.

Ainsi, si les deux lignes que vous affichez sont tout ce qui concerne le codage, alors l'exception se produit dans le premier (pd.read_excel). Vous ne pouvez pas recevoir un problème lié à des séquences d'octets invalides lorsque vous coder, comme dans la deuxième ligne (dans l'expression lambda).

Apparemment, cette entrée spécifique est et non codée en UTF-8 (avec ou sans nomenclature). Confirmer:

>>> 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 

Cependant, sur la base des informations données (caractères français et allemands, la séquence b'\xe9\x20\x20', Windows), les bonnes hypothèses pour le codage réel CP-1252 ou Latin-9 (ISO 8859-15) . Dans les deux, le résultat est le même:

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

Alors, essayez ceci:

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

Si cela ne fonctionne pas pour toutes les entrées, vous aurez probablement le codage et le paramétriser Réglez-le en conséquence pour chaque fichier d'entrée.