J'utilise les étapes suivantes pour lire un fichier .csv:
Ne me demandez pourquoi il y a le test un peu étrange sur la confidence, c'est le seul moyen que j'ai trouvé pour que ça fonctionne avec l'encodage Windows...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 # Détermination de l'encoding filename.seek(0) s=filename.read() result = chardet.detect(s) encoding = result['encoding'] confidence=result['confidence'] if confidence < 0.9 and encoding.startswith('ISO-8859'): encoding='windows-1252' filename.seek(0) # Lecture du fichier for i,row in enumerate(codecs.getreader(encoding)(filename)):
J'ai besoin de la ligne filename.seek(0) pour réinitialiser le curseur de lecture avant l'appel à enumerate. Je ne peux pas conserver le résultat de l'appel initial à la méthode read() car je ne connais pas encore l'encoding à ce stade.
Je peux entrer de deux manières dans la fonction, soit avec un fichier classique (self.request.FILES['file_download'] dans Django, qui nécessite le premier seek), soit avec un fichier qui provient d'un zip. Dans ce cas le fichier est de type ZipExtFile. Malheureusement, la fonction seek ne fonctionne pas sur un fichier de ce type. Comment modifier la fonction pour qu'elle fonctionne également avec les fichiers csv provenant d'un zip?
Partager