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 :

Encodage Latin-1 Lecture de fichiers


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Encodage Latin-1 Lecture de fichiers
    Bonjour,

    Je me permets de vous soumettre un petit problème d'encodage ! J'ai lu des tas de pages/forum sur internet, mais entre les différentes versions de python et les différents encodages, je commence à m'y perdre.

    Je travaille sous Python 3.3 et windows 7. Je cherche à lire des fichiers textes (quand je les ouvres sous windows, aucun problème de lecture). Quand je les ouvre avec Python, plein de problèmes : beaucoup de caractères ne sont pas lus correctement, et les fichiers sont bourrés de \u0327, \u2013,... par exemple. Si j'essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     monText.encode('utf-8', 'replace')
    je récupère b'\xe2\x80\x93' pour '\u2013'

    Si j'essaye 'Latin-1' ou sys.stdout.encoding à la place de 'utf-8' j'obtiens '?'

    Dans ma configuration, sys.stout.encoding vaut 'cp850'.

    Bref la lecture des fichiers est très compliquée !

    Merci pour votre aide !

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Arf j'ai jamais ce problème avec python3

    Tu peux essayer de l'ouvrir avec l'option encoding='utf8'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f = open('fichier.txt', 'r', encoding='utf8')
    print(f.read())
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse !

    Voici ce que ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> f= open(files1, 'r', encoding='utf8')
    >>> f.read()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Program Files\WinPython\python-3.3.2\lib\codecs.py", line 300, in decode
        (result, consumed) = self._buffer_decode(data, self.errors, final)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 158: invalid continuation byte
    J'ai essayé avec Latin-1, les caractères \u**** sont transformés en \x****. Avec cp850, les caractères sont transformés en d'autres caractères assez incohérents et peu compréhensibles...
    Bref peut-être qu'il y a un paramètres dans mon système, python ou quelque part d'autre qui n'est pas bon, mais je m'y connais trop peu pour comprendre où.

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Chez moi ça fonctionne, sous Linux et avec ou sans le paramètre encoding.

    Je pense que cela doit dépendre de ton fichier qui doit avoir un encodage spécifique, faut faire des tests où passer le fichier afin qu'on fasse des tests...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 48
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par Xav Charbi Voir le message
    Merci pour la réponse !

    Voici ce que ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> f= open(files1, 'r', encoding='utf8')
    >>> f.read()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Program Files\WinPython\python-3.3.2\lib\codecs.py", line 300, in decode
        (result, consumed) = self._buffer_decode(data, self.errors, final)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 158: invalid continuation byte
    J'ai essayé avec Latin-1, les caractères \u**** sont transformés en \x****. Avec cp850, les caractères sont transformés en d'autres caractères assez incohérents et peu compréhensibles...
    Bref peut-être qu'il y a un paramètres dans mon système, python ou quelque part d'autre qui n'est pas bon, mais je m'y connais trop peu pour comprendre où.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Sous Python2.7
    >>> string = "Hétérogénéité"
    >>> string
    'H\xc3\xa9t\xc3\xa9rog\xc3\xa9n\xc3\xa9it\xc3\xa9'
    >>> print(string)
    Hétérogénéité
    >>> string.decode('utf-8')
    u'H\xe9t\xe9rog\xe9n\xe9it\xe9'
    >>> print(string.decode('utf-8'))
    Hétérogénéité
    Les caractères bizarres que tu vois, c'est la représentation interne de Python. Tu ne manipules pas des caractères, mais des chiffres.
    Avec un print(), tu afficheras les caractères associés à ces chiffres.

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Comme souvent, Python 3 a résolu des problèmes d'encodage mais en a créé d'autres...

    1- on a un fichier texte encodé en utf-8. On le lit de la manière suivante pour le trouver en unicode en mémoire (ici, on ne lit que la 1ère ligne qui contient, par exemple:"abcéèçàùôï"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open(fichier, 'rt', encoding='utf-8') as f:
        ch = f.readline().rstrip()
    Si on n'utilise que le mode 'r', le texte ne sera pas en unicode (2 octets/caractère dans les implantations courantes) mais en byte (1 octet/caractère).

    Maintenant, on veut l'afficher dans la console dos (cmd.exe) dont l'encodage est "cp850". Il faut donc convertir l'unicode en "cp850" comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch = ch.encode("cp850")
    Mais maintenant, si on fait print(ch), cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b'abc\x82\x8a\x87\x85\x97\x93\x8b'
    Ce qui n'est pas très joli. Alors, comment on fait? On fait comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys
    sys.stdout.buffer.write(ch)
    Et là, ça affiche bien dans la console:

    Si on a beaucoup d'affichages comme ça, on peut créer une nouvelle fonction d'affichage. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import sys
     
    def printb(*args, encoding='utf-8', end='\r\n'):
        """affiche les chaines unicode de *args avec l'encodage "encoding" """
        sys.stdout.buffer.write((' '.join(args) + end).encode(encoding))
     
    printb("abcéèçàùôï", "abcéèçàùôï", "abcéèçàùôï", encoding="cp850")
    abcéèçàùôï abcéèçàùôï abcéèçàùôï
    Ok?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2020
    Messages : 1
    Points : 3
    Points
    3
    Par défaut fichier en utf-8 et encodage declaré # coding:utf-8;
    fichier en utf-8 et encodage declaré # coding:utf-8;
    et voilà tout

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par monarc12000 Voir le message
    fichier en utf-8 et encodage declaré # coding:utf-8;
    et voilà tout
    S'il s'agit du "# -*- coding: utf-8 -*-" déclaré au début du code source, ce n'est pas sa signification: c'est une instruction donnée à l'interpréteur Python pour savoir avec quel encodage lire le code source (et donc, en particulier les chaînes de caractères codées "en dur" dans le code). Il faut, bien sûr, que ce code source ait été écrit et sauvegardé avec ce même encodage. Cela ne change pas la nécessité de préciser l'encodage d'un fichier à lire.

    C'est un vieux fil de 2013, et pour lire un fichier texte encodé en utf-8, il suffit maintenant de l'ouvrir avec open("monfichier", "r", encoding="utf-8") pour obtenir en mémoire le texte en Unicode.

    Il reste, bien sûr, le "sauvetage" des fichiers mal fichus après une écriture et une sauvegarde avec des encodages discordants.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Lecture de fichier ASCII et encodage
    Par Ange_blond dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/10/2010, 09h53
  2. Lecture de fichier: encodage utf-8 et iso-8859-1
    Par WindRider_ dans le forum Langage
    Réponses: 2
    Dernier message: 04/11/2009, 10h23
  3. Lecture de fichiers et encodage
    Par sliderman dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2008, 20h23
  4. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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