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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2003
    Messages
    554
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 554
    Par défaut Lecture fichier CSV contenant des caractères accentués
    Bonjour,

    J'ai un fichier CSV contenant exactement les informations suivantes (il s'agit du code APE, activité principale des établissements) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Code;Libellé
    0111Z;Culture de céréales (à l'exception du riz), de légumineuses et de graines oléagineuses
    0112Z;Culture du riz
    0113Z;Culture de légumes, de melons, de racines et de tubercules
    0114Z;Culture de la canne à sucre
    0115Z;Culture du tabac
    0116Z;Culture de plantes à fibres
    Lorsque j'essaie de le lire avec le programme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/python
    # -*- coding: latin-1 -*-
    import csv
    Fichier = open('CODESAPE.CSV', 'rb')
    CSVReader = csv.reader(Fichier,delimiter=';')
    for Ligne in CSVReader : 
    	print(Ligne[0],'===',Ligne[1])
    Fichier.close()
    J'obtiens mes données, mais avec un codage bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ('Code', '===', u'Libell\xe9')
    ('0111Z', '===', u"Culture de c\xe9r\xe9ales (\xe0 l'exception du riz), de l\xe9gumineuses et de graines ol\xe9agineuses")
    ('0112Z', '===', u'Culture du riz')
    ('0113Z', '===', u'Culture de l\xe9gumes, de melons, de racines et de tubercules')
    ('0114Z', '===', u'Culture de la canne \xe0 sucre')
    ('0115Z', '===', u'Culture du tabac')
    ('0116Z', '===', u'Culture de plantes \xe0 fibres')
    Quelqu'un sait-il comment faire pour leur redonner leurs accents ?

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    enlevez simplement les parenthèses dans print(...), cela devrait suffire.

    @+.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Re-bonjour,

    Si vous êtes intéressée par du code conforme à PEP 8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python
    # -*- coding: latin-1 -*-
     
    import csv
     
    with open("CODESAPE.CSV") as csvfile:
        reader = csv.reader(csvfile, delimiter=";")
        for line in reader:
            print "{} === {}".format(*line)
        # end for
    # end with
    @+.

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Ben, ton fichier est encodé, donc faut décoder.

    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
    16
    17
     
    Python 2.7.3 (default, Dec 18 2014, 19:03:52) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import csv
    >>> inf = open("f.csv", "r")
    >>> c = csv.reader(inf, delimiter=';')
    >>> for l in c:
    ...     print ": ".join([i.decode('utf-8') for i in l])
    ... 
    0111Z: Culture de céréales (à l'exception du riz), de légumineuses et de graines oléagineuses
    0112Z: Culture du riz
    0113Z: Culture de légumes, de melons, de racines et de tubercules
    0114Z: Culture de la canne à sucre
    0115Z: Culture du tabac
    0116Z: Culture de plantes à fibres
    >>>

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

    Citation Envoyé par VinsS Voir le message
    Ben, ton fichier est encodé, donc faut décoder.
    C'est plus propre mais ce n'est pas obligatoire d'autant que le module CSV de Python 2 demande a ce que les fichiers soient ouvert 'rb' (i.e. en mode "binaire" plutôt qu'en mode "texte").

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

  6. #6
    Membre expérimenté
    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
    Par défaut
    oui, j'ai eu affaire avec ce genre de galère : il faut absolument que tu maitrises ton encodage du fichier que tu lis, et celui dans lequel tu écris.
    récupère l'encodage de ton fichier csv d'origine : utf8_bom, utf8, iso8859-1 ... what else ...
    regarde comment la méthode "reader" de ton objet CSV décode ton fichier (documentation et/ou code source directement) et tu auras les éléments pour :
    - soit définir le bon encodage (si la méthode csv.reader possède un paramètre gérant le type d'encodage)
    - soit tu te sers de librairies telle que "codecs (méthode reader/writer) " pour lire ton fichier avec le bon encodage et réécrire en celui qui est géré par "csv.reader"

    la maitrise de l'encodage, le nerf de la guerre en python : c'est la 1èere chose à maitriser.

    de manière générale, je conseille de tout passer en unicode, UTF8 et toujours se demander si je travaille avec le bon encodage

    petit rappel : les 256 premiers caractères (au sens de l'encodage de caractères, en gros, lettre sans accent et chiffre, qq symbôles basiques ...) sont gérés de manière identique qq soit l'encodage, si un caractères est hors ces 256, tu auras besoin de définir et maitriser l'encodage, donc autant le faire d'entrée de jeu.

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, 17h12
  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, 07h45
  3. Réponses: 3
    Dernier message: 11/06/2007, 11h20
  4. Charger un fichier texte contenant des caractères
    Par dm_manu dans le forum MATLAB
    Réponses: 5
    Dernier message: 24/12/2006, 02h37
  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, 21h46

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