web-dev-qa-db-fra.com

UnicodeDecodeError: (codec 'utf-8') lors de la lecture d'un fichier csv

ce que j'essaye est de lire un csv pour créer un cadre de données --- apporter des modifications dans une colonne --- encore une fois mettre à jour/refléter la valeur modifiée dans le même csv (to_csv) - encore une fois essayer de lire ce csv pour créer un autre cadre de données ... là je reçois une erreur

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 7: invalid continuation byte

mon code est

 import pandas as pd
 df = pd.read_csv("D:\ss.csv")
 df.columns  #o/p is Index(['CUSTOMER_MAILID', 'False', 'True'], dtype='object')
 df['True'] = df['True'] + 2     #making changes to one column of type float
 df.to_csv("D:\ss.csv")       #updating that .csv    
 df1 = pd.read_csv("D:\ss.csv")   #again trying to read that csv

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 7: invalid continuation byte

Veuillez donc suggérer comment éviter l'erreur et pouvoir relire ce fichier csv dans une base de données.

Je sais que quelque part me manque "encode = un type de codec" ou "décode = un type" en lisant et en écrivant à CSV.

Mais je ne sais pas ce qui devrait être changé exactement. J'ai donc besoin d'aide.

20
Satya

Encodage connu

Si vous connaissez le codage du fichier que vous voulez lire, vous pouvez utiliser

pd.read_csv('filename.txt', encoding='encoding')

Voici les encodages possibles: https://docs.python.org/3/library/codecs.html#standard-encodings

Codage inconnu

Si vous ne connaissez pas l'encodage, vous pouvez essayer d'utiliser chardet, mais son fonctionnement n'est pas garanti. C'est plus un travail de conjecture.

import chardet
import pandas as pd

with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
40
MaxNoe

Une solution simple consiste à ouvrir le fichier csv dans un éditeur tel que Sublime Text et à l'enregistrer avec le codage 'utf-8'. Ensuite, nous pouvons facilement lire le fichier à travers des pandas.

11
Krishnaa

Cette erreur survient-elle lors de votre première lecture des données, ou lors de la seconde lecture après que vous les ayez écrites et relues? Mon hypothèse est que cela se produit réellement à la lecture en premier des données, car votre CSV a un codage qui n'est pas UTF-8.

Essayez d’ouvrir ce fichier CSV dans Notepad ++, Excel ou LibreOffice. Votre source de données contient-elle le caractère ç (C avec cedilla)? Si tel est le cas, l'octet 0xE7 que vous voyez est probablement le ç codé en latin-1 ou en Windows-1252 (appelé "cp1252" en Python).

En regardant la documentation pour la fonction Pandas read_csv()) _, je vois qu'il a un paramètre encoding, qui devrait être le nom Vous devez vous attendre à ajouter encoding="cp1252" à votre appel read_csv() de la manière suivante:

df = pd.read_csv(r"D:\ss.csv", encoding="cp1252")

Notez que j'ai ajouté le caractère r devant le nom du fichier, de sorte qu'il soit considéré comme une "chaîne brute" et que les barres obliques inverses ne soient pas traitées spécialement. Ainsi, vous ne serez pas surpris lorsque vous modifiez le nom de fichier de ss.csv En new-ss.csv, Où la chaîne D:\new-ss.csv Serait lue comme suit: D, :, Caractère de nouvelle ligne, e, w, etc.

Quoi qu'il en soit, essayez ce paramètre d'encodage lors de votre premier appel read_csv() et voyez si cela fonctionne. (Ce n'est qu'une hypothèse, car je ne connais pas vos données réelles. Si le fichier de données n'est pas privé et n'est pas trop volumineux, essayez de l'afficher afin que nous puissions voir son contenu - cela nous permettrait de faire mieux. que de deviner.)

8
rmunn

Oui, vous aurez cette erreur. J'ai contourner ce problème en ouvrant le fichier csv dans Notepad ++ et en modifiant l'encodage via le menu Encodage -> convertir en UTF-8. Puis enregistrez le fichier. Ensuite, exécutez à nouveau le programme python).

Une autre solution consiste à utiliser le module de codecs dans python pour l'encodage-décodage de fichiers. Je ne l'ai pas utilisé.

4

La méthode ci-dessus utilisée pour importer puis détecter le type de fichier fonctionne import chardet

import pandas as pd
import chardet
with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
3
Abhishek

Je suis nouveau sur Python. Couru dans ce problème exact quand j'ai manuellement changé l'extension de mon fichier Excel en .csv et que j'ai essayé de le lire avec read_csv. Cependant, si j’ai ouvert le fichier Excel et que j’ai sauvegardé le fichier csv, cela a semblé fonctionner.

2
Matt