IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Lecture fichier CSV contenant des caractères accentués


Sujet :

Python

  1. #21
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par sweetasnz Voir le message
    import cStringIO : c'est du pur python2, d'ailleurs, savez-vous l'équivalent Python3 pour cette Lib ? "io" ?
    Oui => io.StringIO


    Citation Envoyé par sweetasnz Voir le message
    conclusion : décode ton fichier "iso8859" et travaille sur de l'unicode ça téviteras des galères. et biensur tu écris tout en "utf8"
    Le principe qui diminue les problèmes d'encodage dans un programme Python 2 est:
    - tout ce qui rentre est converti en unicode le plus tôt possible
    - tout ce qui sort est converti à partir de l'unicode dans le bon encodage le plus tard possible
    - entre les 2, on ne travaille qu'en unicode.

    En faisant ça, on ne fait que se rapprocher du comportement de Python 3.

    Il faut se méfier de l'utf-8 pour travailler à l'intérieur d'un programme, parce que le nombre d'octets dépend du caractère. Par exemple, le mot "tête" comporte 4 caractères mais 5 octets en utf-8. Cela provoque des anomalies dans le traitement des chaines. En contrepartie, l'utf-8 est très bon pour communiquer avec l'extérieur du programme, parce qu'il a des capacités excellentes de représenter des caractères dans des langues étrangères. Ce n'est pas par hasard si c'est l'encodage par défaut des linux récents.

  2. #22
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par enicnath Voir le message
    Ah erreur de ma part ; je viens de vérifier, je suis effectivement en Python2.
    Mais il vaudrait peut-être mieux que je passe en Python3 !
    ok pour reprendre les bouts de code qu'on t'a donné, cependant, il faut un minimum l'adapter à ta situation ET DONC à L'ENCODAGE DE TON FICHIER INITIAL.
    là on ne peut pas franchement t'aider plus, donc :
    Lis ton fichier avec le bon "encoding" (tyrtamos lis avec de l'utf8 alors que tu as dis que ton fichier était en iso8859, donc lis le avec iso8859)

    code de tyrtamos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def lirecsv(fichier, codisk):
        """lit le fichier CSV encodé codisk, et le retourne comme une 
           liste de listes unicode (tableau)
        """
        codcsv = "utf-8" # encodage supporté par le module csv
    bref, tu as tous les éléments, refait un test en vérifiant la véracité de tes lignes de codes (les unes après les autres, pas à pas) par rapport avec ton fichier.
    sinon renvoie le code que tu utilises car je ne voit pas pourquoi cela ne fonctionnerait pas chez toi, alors que chez nous (python26, 27) cela fonctionne bien.

    allez courage, ça va forcemment passer un jour

  3. #23
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par sweetasnz Voir le message
    Lis ton fichier avec le bon "encoding" (tyrtamos lis avec de l'utf8 alors que tu as dis que ton fichier était en iso8859, donc lis le avec iso8859)
    Ce n'est pas tout à fait ça: dans mon code, l'encodage du fichier csv est donné comme paramètre "codisk" pour que la lecture du fichier soit correcte. Mais à l'intérieur de la fonction de lecture, il faut une conversion en utf-8 parce que sous Python 2, le module csv n'accepte que de l'utf-8. Et le résultat est renvoyé à l'appelant en unicode.

    1- Il faut donc qu'il adapte l'encodage du fichier csv, donc qu'il mette codisk="iso8859" là où j'ai mis codisk="cp1252"

    2- et qu'il fasse attention au code d'affichage en fonction de l'encodage de sa console, car un mauvais encodage plante les programmes.

    A part ça, je suis entièrement d'accord!

  4. #24
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Mais à l'intérieur de la fonction de lecture, il faut une conversion en utf-8 parce que sous Python 2, le module csv n'accepte que de l'utf-8. Et le résultat est renvoyé à l'appelant en unicode.
    je crois qu'on a tout avec ça
    a+ et bonne chance à enicnath

  5. #25
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 445
    Points : 37 038
    Points
    37 038
    Par défaut
    Salut,

    Difficile de ne pas noter combien "mieux" devient ici ennemi de "bien".

    Ça démarre avec un "print" foireux à cause de parenthèses qui affichent un tuple.
    Cela corrigé, il n'y aurait plus eu de problèmes: "bien".
    Et c'est une des toutes premières réponses.

    Mais comme nous faisons le prosélytisme de "bonnes pratiques", difficile de ne pas apprendre à gérer l'encoding.

    Comme le module CSV de Python2 ne sait pas travailler avec de Unicode, il faut lui passer des bytes comme l'"utf-8" mais "latin-1" suffirait aussi de ce côté-ci de l'Europe, non?
    Il faut quand même se souvenir que nous avons vécu des dizaines d'années sans se prendre le chou à convertir les bytes en texte pour respecter l'encoding et que des strings de bytes restent tout a fait acceptables tant qu'on ne touche pas à utf-8 (où un byte n'équivaut plus toujours à un caractère).

    Pourquoi se prendre le chou à vouloir faire "mieux" (surtout avec le module csv de Python2) alors que le soucis rencontré serait résolu si on se contentait de "bien"?
    D'autant qu'on sait que ce "mieux" s'appelle Python3 et que le PO n'a pas (à priori) de soucis à l'utiliser.

    - W
    note: il existe aussi un module Python2 sur PyPi appelé unicodecsv prêt à l'emploi.

  6. #26
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    résolu non ?
    pensez à mettre à jour le statut de votre post

Discussions similaires

  1. [AC-2003] Import de fichier CSV => Modification des caractères accentués
    Par Kloun dans le forum Access
    Réponses: 5
    Dernier message: 05/01/2011, 18h12
  2. import de fichier CSV : problème de caractères accentués
    Par mouaa dans le forum Administration
    Réponses: 2
    Dernier message: 08/08/2007, 08h45
  3. Réponses: 3
    Dernier message: 11/06/2007, 12h20
  4. Charger un fichier texte contenant des caractères
    Par dm_manu dans le forum MATLAB
    Réponses: 5
    Dernier message: 24/12/2006, 03h37
  5. [Upload] Nom de fichier avec un/des caractères accentués ?
    Par Christophe Charron dans le forum Langage
    Réponses: 11
    Dernier message: 09/06/2006, 22h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo