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 :

gérer du csv, soucis d'encodage


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut gérer du csv, soucis d'encodage
    bonjour j'ai pris ça sur internet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def dictionnaire():
        #utilise le fichier dictionnaire.csv du meme dossier
        f = open('dico2_macosroman.csv', 'r')
        with f:
            reader = csv.reader(f)
            for row in reader:
                for e in row:
                    print(e)
     
    dictionnaire()
    j'ai essayé avec un fichier csv encodé en UNICODE, mais j'ai cru lire quelque part que le module csv ne gérait pas le unicode
    alors j'ai essayé avec un fichier enregistré au format "occidental, mac os roman"
    pareil
    voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py", line 26, in decode
        return codecs.ascii_decode(input, self.errors)[0]
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x8e in position 31: ordinal not in range(128)
    j'utilise python 3.6.5 et textedit sous mac os 10.12.6

    Vincent

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    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 677
    Par défaut
    Salut,

    Citation Envoyé par elodouwen Voir le message
    j'ai essayé avec un fichier csv encodé en UNICODE, mais j'ai cru lire quelque part que le module csv ne gérait pas le unicode
    Python ne connaît pas l'encoding de vos fichiers. Donc soit, c'est l'encoding par défaut (le plus souvent utf-8 avec Python3 mais çà peut être autre chose suivant l'environnement et la configuration) soit il faut le préciser à l'open du fichier.

    Citation Envoyé par elodouwen Voir le message
    j'ai essayé avec un fichier csv encodé en UNICODE, mais j'ai cru lire quelque part que le module csv ne gérait pas le unicode
    Tout à fait mais çà c'était "avant" i.e. avec Python2.
    Avec Python3, il sait le faire...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    ok merci j'ai donc mis tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def dictionnaire():
        #utilise le fichier dictionnaire.csv du meme dossier
        f = open('dictionnaire.csv', 'r', encoding='utf-8')
        with f:
            reader = csv.reader(f)
            for row in reader:
                    print(row)
    et ça marche nickel

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    je poursuis dans ce fil car je ne sais pas si oui ou non le souci est de même nature
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        f = open('dictionnaire_consulter.csv', 'w',encoding='utf-8')
        with f:
            writer = csv.writer(f)
            for row in L:
                print(row[0])
                chiffre=str(row[0]),"-----"
                writer.writerow(chiffre)
                for mots in row[1]:
                    print((mots))
                    writer.writerow((mots))
    l'instruction "print(mots)" renvoie... des mots ou des phrase, style :
    abc
    bonjour
    la veillée de Noël
    bref exactement ce qui est dans L
    pour info voici à quoi ressemble mon L
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L=[(3, ['a', 'c']), (45, ['la veillée de Noël'])]
    par contre
    l'instruction writer.writerow((mots)) écrit dans le fichier concerné les mots avec les lettres séparées par des virgules...
    style :
    a,b,c
    b,o,n,j,o,u,r
    j'ai essayé de chercher du côté de "delimiter" mais ça ne prend que des chaînes d'un seul caractère, pas des chaînes vides
    je ne sais pas trop quoi faire là...

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    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 677
    Par défaut
    Salut,
    Citation Envoyé par elodouwen Voir le message
    je poursuis dans ce fil car je ne sais pas si oui ou non le souci est de même nature
    S'agit-il du problème d'encoding initial?

    Citation Envoyé par elodouwen Voir le message
    je ne sais pas trop quoi faire là...
    Il faut ouvrir la documentation du module CSV pour essayer de comprendre à quoi ressemble le paramètre à passer à .writerow.
    Ceci dit, "writerow" c'est écrit ligne... donc sachant que la fonction va ajouter les bons delimiters, si vous deviez l'écrire, vous feriez comment? Et quelle serait la représentation commode de cet argument?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    le problème d'encoding initial (en lecture donc) était résolu
    quant à vos questions, je vous remercie de m'aider à trouver des pistes mais je saisis mal
    si je devais l'écrire, vous voulez dire écrire la fonction writerow ?
    ce que je ne comprend pas c'est que le print((mots)) affiche parfaitement les mots dans la console, tandis que le writer.writerow((mots)) sépare les lettres avec des virgules
    j'ai fouillé dans la doc de csv (j'ai peut être mal fouillé mais j'y ai passé du temps) ainsi que sur internet, je ne trouve que des documentations semblables sur le paramètre delimiter mais il me semble que ce n'est pas le bon angle d'attaque
    il y a qqch à comprendre sur le fait que par défaut il affiche des mots dont les lettres sont séparées par des virgules
    je nage....

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 032
    Par défaut
    quant à vos questions, je vous remercie de m'aider à trouver des pistes mais je saisis mal
    Dans votre post n°4 je ne vois pas de questions, et ce que vous cherchez à faire. Un exemple de ce que vous avez, mais pas ce que vous attendez ou attendiez...

    csv est un module qui travaille sur des fichiers csv, donc de type texte, ce n'est donc pas une obligation de travailler avec si le besoin ne s'en fait pas sentir.
    Les méthodes liées aux chaînes de caractères peuvent peut-être suffirent.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    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 677
    Par défaut
    Salut,

    Citation Envoyé par elodouwen Voir le message
    quant à vos questions, je vous remercie de m'aider à trouver des pistes mais je saisis mal
    si je devais l'écrire, vous voulez dire écrire la fonction writerow ?
    C'est quoi un fichier CSV? Une suite de lignes contenant des valeurs séparées par...
    Et si writerow écrit une ligne de ce type de fichier, difficile de ne pas représenter ces valeurs par une séquence.
    Pour transformer cette séquence en chaine de caractères séparée par ... vous devez connaître .join:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> row = 1,2,'a'
    >>> ','.join(str(z) for z in row)
    '1,2,a'
    >>>
    note: et accessoirement constater que vous n'avez pas trop besoin du module CSV pour faire çà...

    Si cette séquence est 'abc', on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> row = 'abc'
    >>> ','.join(str(z) for z in row)
    'a,b,c'
    >>>
    Et writerow fait pareil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import csv
    >>> import sys
    >>> w = csv.writer(sys.stdout)
    >>> row = 1,2,'a'
    >>> w.writerow(row)
    1,2,a
    7
    avec 'abc':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> row = 'abc'
    >>> w.writerow(row)
    a,b,c
    7
    >>>
    Tout çà pour dire qu'une bibliothèque/module tel que CSV est une solution qui a été écrite pour répondre à un besoin et éviter aux programmeurs de perdre leur temps à coder leurs solutions particulières.
    Si vous ne comprenez pas le problème à résoudre et que vous avez des difficultés à imaginer ce que pourrait être une solution, vous pourrez lire la documentation 50 fois, çà restera un charabia dont vous ne saurez que faire....

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    bonjour
    j'ai simplifié mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/python3
    import csv
    f = open('dictionnaire_consulter.csv', 'w')#(,encoding='utf-8')
    with f:
        writer = csv.writer(f)
        mots="abc"
        writer.writerow((mots))
    le résultat est que le fichier "consulter.csv" contient non pas abc mais a,b,c

    j'ai bien noté que join permet de concaténer plusieurs chaînes avec un délimiteur choisi, mais ici il n'y a qu'une seule chaîne, que la méthode writerow semble spliter en caractères séparés
    je m'étonne de ce comportement là
    mais je peux concevoir, effectivement, que l'esprit de csv étant de séparer les éléments par des virgules, writerow voie une liste là où je vois une chaîne

    mon but est de créer un fichier texte formé de lignes du type
    mot,chiffre
    mot,chiffre
    mot,chiffre
    etc

    je ne suis pas accroc particulièremen à csv, mais vu que le fichier texte dstination ne doit contenir que des informations simples comme ça j'ai pensé que le module csv conviendrait
    dans mon esprit, les "colonnes" à séparer par des virgules sont le mot, puis son chiffre

    je n'avais pas imaginé que le module csv considèrerait chaque "mot" comme une liste de lettres à placer dans des "colonnes" différentes

    si maintenant écrire une chaîne avec csv oblige à la splitter sans possibilité de la concaténer je chercherai un autre module

    comment utiliser join avec une seule chaîne ?

    Vincent

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    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 677
    Par défaut
    Citation Envoyé par elodouwen Voir le message
    j'ai bien noté que join permet de concaténer plusieurs chaînes avec un délimiteur choisi, mais ici il n'y a qu'une seule chaîne, que la méthode writerow semble spliter en caractères séparés
    je m'étonne de ce comportement là
    Si writerow prend une séquence de valeurs, à quoi pourrait ressembler une séquence ne contenant qu'une seule valeur comme 'abc' ?
    [ 'abc' ] ou ('abc',) car 'abc' est aussi une séquence des 3 valeurs a, b, c.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 032
    Par défaut
    mon but est de créer un fichier texte formé de lignes du type
    mot,chiffre
    mot,chiffre
    mot,chiffre
    etc
    Eh bien je ne comprend pas, désolé ! Dans votre exemple, je ne vois pas de chiffre.

    Une autre solution, si on doit séparer mot et chiffre pourrait être les expressions régulières.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import re
    >>> value = 'abc1128'
    >>> splitter = re.split("([a-z]+)([0-9]+)", value)
    >>> ','.join([_ for _ in splitter if _])
    'abc,1128'
    Après je me trompe peut-être sur ce dont vous avez besoin.

  12. #12
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si writerow prend une séquence de valeurs, à quoi pourrait ressembler une séquence ne contenant qu'une seule valeur comme 'abc' ?
    [ 'abc' ] ou ('abc',) car 'abc' est aussi une séquence des 3 valeurs a, b, c.

    - W
    je n'ai pas très bien compris mais vous m'avez quand même donné la puce à l'oreille
    j'ai remplacé writer.writerow(mots) par l'instruction writer.writerow([mots])
    j'ai cru comprendre à votre message que writerow ne sait gérer que des listes, et que si on lui donne un mot, il le prend comme une liste, tandis que si on lui donne une liste ne contenant qu'un mot, il prend ce mot comme un élément (de la liste) et donc ne le splitte pas

    merci à tous pour votre participation, cela n'avait donc rien à voir avec l'encodage finalement, comme je l'envisageais au départ.

    j'imagine aussi à vous lire qu'il y a d'autres modules permettant d'écrire sur un fichier texte et je vais regarder ça

Discussions similaires

  1. [CSV] Problème d'encodage
    Par simoryl dans le forum Langage
    Réponses: 13
    Dernier message: 18/04/2012, 15h20
  2. Formulaire CGI, soucis d'encodage
    Par Olivier Regnier dans le forum Web
    Réponses: 0
    Dernier message: 22/01/2008, 12h57
  3. Souci d'encodage UTF-8 (config non prise en compte)
    Par Assimil dans le forum Zend Studio
    Réponses: 6
    Dernier message: 03/07/2007, 12h38
  4. [CSV] conflit d encodage
    Par philippe123 dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2006, 13h56
  5. [C#][CSV] souci d'encodage
    Par papouAlain dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/12/2005, 16h48

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