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 de fichier texte


Sujet :

Python

  1. #1
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut encodage de fichier texte
    Salut,
    J'utilise un petit script python tout bête pour lire des fichiers logs.
    Mais le problème ce que j'obtients des lignes de ce genre là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '\xff\xfeT\x00i\x00m\x00e\x00s\x00t\x00a\x00m\x00p\x00 \x00 \x00 \x00 \x00 \x00...
    Je pense que c'est un problème d'encodage du fichier mais je ne sais pas quoi utiliser dans python pour réencoder ces données pour les rendre exploitable.

    Si j'ouvre le fichier et que je le sauvegarde tel quel, alors c'est bon, je peux le lire.
    Petite précision, les fichiers viennent d'un windows server 2003 et je suis sous ubuntu...

    Merci pour vos éclairages

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2007
    Messages : 105
    Points : 145
    Points
    145
    Par défaut
    Bonjour,

    Est ce que tes fichiers sont bien du texte ?
    As tu utiliser au début de ton script une balise du genre ?Comme tu dis être sous Ubuntu, que donne la commande file <nom_du_fichier_de_log> dans un terminal ?

    Salutations.

  3. #3
    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,

    Si l'exemple que tu as donné est bien le début du fichier texte, il semble qu'il y ait un "FF FE", caractéristique du BOM de l'UTF-16 little Indian (http://fr.wikipedia.org/wiki/Byte_Order_Mark).

    Tu pourrais donc lire lire le fichier comme suit en utilisant le module codecs (http://docs.python.org/library/codecs.html):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import codecs
     
    L = []
    f = codecs.open(nomduficher, 'r', 'utf_16_le')
    for ligne in f:
        L.append(ligne.rstrip('\r\n'))
    f.close
    Voilà, les lignes de ton fichier sont en unicode Python dans la liste L en mémoire ram.

    Maintenant, si tu veux les afficher, il faut que tu connaisses l'encodage de ta console d'affichage. Pour la connaitre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys
    print sys.stdout.encoding
    En imaginant que ce soit utf-8 (probable avec Ubuntu), il faudrait afficher comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ligne in L:
        print ligne.encode('utf_8')
    J'ai fait ça de mémoire sans tester: essaye!

    Tyrtamos
    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

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bien vu tyrtamos,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a = '\xff\xfeT\x00i\x00m\x00e\x00s\x00t\x00a\x00m\x00p\x00 \x00 \x00 \x00 \x00 \x00'
    >>> print unicode(a, 'UTF16')
    Timestamp     
    >>>
    Petit edit pour julien.63 :

    Citation Envoyé par julien.63 Voir le message
    Si j'ouvre le fichier et que je le sauvegarde tel quel, alors c'est bon, je peux le lire.
    C'est que ton editeur comprend l'utf-16 en lecture mais l'encode avec son codec en écriture.
    Le fichier source et celui écrit sont différents. Utilise len et tu ne trouveras pas les mêmes résultats.

    ps: Trouver de l'utf-16 juste avec \xff\xfe alors que j'en suis encore à me battre avec les codec can't decode byte... Pas mal tyrtamos
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    ps: Trouver de l'utf-16 juste avec \xff\xfe alors que j'en suis encore à me battre avec les codec can't decode byte... Pas mal tyrtamos
    Juste un petit complément d'information, ce ne sont pas des informations obligatoires pour un fichier codé en UTF, mais juste préconisé.

    L'acronyme correspondant à ces données est : BOM.

    Ici une petite faq : http://unicode.org/faq/utf_bom.html#bom1

    Si tu utilises l'éditeur texte notepad++, dans le menu format tu as les options pour transformer ton fichier en utf ou en national avec ou sans BOM.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  6. #6
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    Merci pour vos réponses.

    J'ai essayé en utilisant la library codes et ça fonctionne bien.

    Par contre, en utilisant unicode et l'encode UTF16, j'ai un message d'erreur.
    voici ce que j'ai fait :
    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
    18
    19
    20
    21
    In [2]: f = open('HEIMDALL-20091103-1154.log')
     
    In [3]: l = f.readline()
     
    In [4]: l
    Out[4]: '\xff\xfeT\x00i\x00m\x00e\x00s\x00t\x00a\x00m\x00p\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\t\x00P\x00r\x00o\x00c\x00e\x00s\x00s\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\t\x00T\x00I\x00D\x00 \x00 \x00 \x00\t\x00A\x00r\x00e\x00a\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\t\x00C\x00a\x00t\x00e\x00g\x00o\x00r\x00y\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\t\x00E\x00v\x00e\x00n\x00t\x00I\x00D\x00\t\x00L\x00e\x00v\x00e\x00l\x00 \x00 \x00 \x00 \x00 \x00\t\x00M\x00e\x00s\x00s\x00a\x00g\x00e\x00 \x00\t\x00C\x00o\x00r\x00r\x00e\x00l\x00a\x00t\x00i\x00o\x00n\x00\r\x00\n'
     
    In [5]: print(unicode(l, 'UTF16'))
     
    UnicodeDecodeError                        Traceback (most recent call last)
     
    /home/julien/Desktop/SPlog/03112009/<ipython console> in <module>()
     
    /usr/lib/python2.6/encodings/utf_16.pyc in decode(input, errors)
         14 
         15 def decode(input, errors='strict'):
    ---> 16     return codecs.utf_16_decode(input, errors, True)
         17 
         18 class IncrementalEncoder(codecs.IncrementalEncoder):
     
    UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 350: truncated data

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    C'est ton retour à la ligne (\n) qui pose souci.
    Il est possible de tester la présence du \n mais si codes fonctionne bien...

    @+
    Merci d'utiliser le forum pour les questions techniques.

  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,

    C'est bien pour ça que j'ai proposé d'utiliser le module codecs, et c'est facile à comprendre pourquoi:

    Le readline habituel lit les caractères en s'arrêtant au 1er '\r' et/ou '\n'. Mais il n'a pas connaissance de l'encodage au moment où il lit . Dès qu'on lui fait lire un encodage multi-caractères comme l'utf-16, il risque, par exemple, de s'arrêter à une partie d'un caractère normal. Ce que la fonction de décodage qui suit n'aime pas du tout.

    Alors que l'appel au readline du module codecs connait l'encodage donné à l'ouverture, et ne se fait pas piéger comme ça.

    Tyrtamos
    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. [Débutant] Comment connaitre le type d'encodage des fichiers textes ?
    Par saxrub dans le forum VB.NET
    Réponses: 1
    Dernier message: 30/03/2012, 11h26
  2. encodage dans fichier texte
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 11
    Dernier message: 06/01/2012, 17h13
  3. Type d'encodage de fichiers texte
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 28/02/2007, 10h28
  4. Déterminer l'encodage du fichier texte
    Par ze.Ninus dans le forum Langage
    Réponses: 1
    Dernier message: 10/10/2006, 16h43

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