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 :

convertir fichier binaire en txt


Sujet :

Python

  1. #1
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut convertir fichier binaire en txt
    Bonjour, je cherche a convertir un fichier binaire (monfichier.per) en un fichier txt en python, mais je bloque, voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with open("test.per", "rb") as f:
        byte = f.read(1)
        while byte:
            # Do stuff with byte.
            byte = f.read(1)
            print (byte)

    Ce code m'affiche des truc comme :
    b'\x00'

    Moi je voudrais du texte.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Si votre fichier est un fichier texte, il suffirait de l'ouvrir avec le mode "r" - plutôt que "rb" en précisant éventuellement l'encoding.
    S'il est "binaire", çà veut peut être dire qu'il va falloir regrouper des octets pour les convertir en entiers, flottants,... et autres joyeusetés.
    Et comme seul vous savez comment sont "structurées" les données contenues dans le fichier, il va falloir écrire le code qui va bien (ou s'aider de bibliothèques qui mâchent un peu le boulot comme struct.

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

  3. #3
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Il s'agit bien d'un fichier binaire, qui doit être convertie en fichier texte.

  4. #4
    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 sazearte Voir le message
    Il s'agit bien d'un fichier binaire, qui doit être convertie en fichier texte.
    Formulée comme ça, cette question est trop ouverte.

    Un texte est censé être imprimable (ce que n'est pas b'\x00'). Si le fichier binaire correspond bien à un texte imprimable, il est encodé avec un encodage qu'il faut connaître, deviner ou tester ('utf-8'? 'utf-16'?), et la réponse est déjà donnée par wiztricks.

    Mais si c'est autre chose: un zip, un exécutable, une image jpg, une base de données, etc..., il faut alors trouver une solution adaptée en fonction de ce que c'est.

    Autre exemple, on veut quelquefois convertir un fichier binaire de sorte qu'il puisse être transmis grâce à un fichier texte (comme le font les emails avec les pièces jointes). Il y a des solutions.

    Bref: il faut préciser!
    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

  5. #5
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Je ne sais pas ce que contient ces fichiers, le développeur qui a conçue ce code et partie.
    Tous ce que je sais c'est que sa contient des données (entier, long, char...)

    Je ne sais même pas si c'est un fichier binaire ou compiler, si il y a un moyen de savoir ?

    J'envoie le fichier en pièce jointe au cas ou.0_Hist_CH1_20150329233201.zip


    En tous cas merci quand meme pour votre aide.

  6. #6
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Vous utilisez WordPerfect ? Si oui, essaye de l'ouvrir avec ce programme.

  7. #7
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Non, mais c'est bon, j'ai trouvé la fonction pour décoder :

    Dans l'ancien code:
    char(fread(fid,[1, 4],'char')) ;

    en Python:
    byte = f.read(4)
    var=byte.decode("utf-8")
    print (var)


    Sa marche tres bien, mais apres j'ai :
    fread(fid,[1, 1],'long') ;

    Mais en python :
    byte = f.read(1)
    var=byte.decode("utf-8")
    print (var)

    Sa affiche rien ! pourquoi ? et comment corriger ce problème ?


    Voici le début du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Config = ReadHeaderPertu2(fid)
    Config.magic            = char(fread(fid,[1, 4],'char')) ;
    Config.old_magic        = fread(fid,[1, 1],'long') ; %    /* Pour conserver l'ancien format          */
    Config.node             = char(fread(fid,[1, 16],'char')) ; %     /* Nom de la cible                 */
    Config.appli            = char(fread(fid,[1, 16],'char')) ; %    /* Nom de l'application                    */
    Config.filename         = char(fread(fid,[1, 254],'char')) ; %/* Nom du fichier de sauvegarde        */  
    Config.mapname          = char(fread(fid,[1, 254],'char')) ; % /* Nom du fichier DONP.map             */
    Ce code est fait sous mathlab,
    Je récupere bien le Nom de la cible, Nom de l'application et Nom du fichier de sauvegarde, le reste non, pourquoi ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par sazearte Voir le message
    Sa marche tres bien, mais apres j'ai :
    fread(fid,[1, 1],'long') ;

    Mais en python :
    byte = f.read(1)
    var=byte.decode("utf-8")
    print (var)

    Sa affiche rien ! pourquoi ? et comment corriger ce problème ?
    A priori, un "long" est représenté par 4 bytes: pourquoi f.read(1)?
    Un long codé en binaire n'est pas du texte: il n'y a aucune raison pour appliquer .decode('utf-8') aux bytes lus.
    et c'est là qu'il faut regarder ce que sait faire le module "struct".

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

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    hello,
    le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(fid,[1, 1],'long')
    de mathlab permet de récupérer un élément de type long donc 4 octets.
    Comme on peut le voir dans la représentation en hexa du fichier binaire que tu as fourni :
    Nom : PerHexa.png
Affichages : 4544
Taille : 9,6 Ko
    les 4 octets du long sont à zéro.

    Je récupere bien le Nom de la cible, Nom de l'application et Nom du fichier de sauvegarde, le reste non, pourquoi ?
    Quel reste ? dans le fichier binaire après le nom du fichier de sauvegarde il y a des zéros jusqu'à l'adresse hexa 226 (550 en décimal) donc pas de mapname.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Pour lire un long, j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        file_size, = struct.unpack("i",f.read(4))
        print (file_size)
    Mais je bloque sur 2 points :

    Config.timedec = fread(fid,[1, 2],'long') ; % /* Datation dÚclenchement */
    Je dois mettre quoi ?

    Config.nb_channel = fread(fid,[1, 1],'int') ; % /* Nombre de connexions */
    Un entier tient sur 2 octets, mais en python, fread n'accepte que 4 !, si je change j'ai ue erreur pourquoi ?, es ce que je l'utilise mal ?
    struct.unpack("i",f.read(4))

  11. #11
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    hello,

    sazearte a osé dire :
    mais en python, fread n'accepte que 4 !
    Où as-tu vu ça ?????? Quelle version de python ?
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  12. #12
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Oui j'ai dit une grosse connerie ,

    voila mon problème, je dois convertir un code sous mathlab en python, rien de très compliquer, sauf la lecture d'un fichier binaire:

    Sous mathlab j'ai ceci:

    Config.old_magic = fread(fid,[1, 1],'long')
    En python:
    file_size, = struct.unpack("l",f.read(4))
    print (file_size)

    La ou je bloque c'est la dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Config.DaughterPert 		= fread(fid,[1, 16],'long');
    Je dois mettre quoi ?

    Pour les char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Config.mapname          = char(fread(fid,[1, 254],'char'))
    Je mets ceci, mais je suis pas sur que se soit le bon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        byte = f.read(254)
        var=byte.decode("utf-8")
        print (var)

  13. #13
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 952
    Points : 9 281
    Points
    9 281
    Par défaut
    hello,

    pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Config.DaughterPert = fread(fid,[1, 16],'long');
    cela me semble être un tableau de 16 éléments de 4 octets.

    et pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     byte = f.read(254)
        var=byte.decode("utf-8")
        print (var)
    je ne suis que novice en python alors plutôt que de raconter des bêtises je laisse les spécialistes répondrent. Par contre le utf-8 ne me paraît pas forcément justifié car ton fichier binaire n'est peu-être pas en utf-8.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  14. #14
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    cela me semble être un tableau de 16 éléments de 4 octets.
    Oui c'est cela, mais le décodage marche une fois sur 2...
    struct.unpack('10h', f.read(20))
    Un coup sa marche très bien, une autre j'ai ce message:
    python struct valueerror too many values to unpack (expected 1)


    Mais, je pense avoir trouvé le problème, par exemple quand c'est écrit char sous matlab, en python se serait théoriquement "char" qu'il faudrait utiliser, mais en faite non, le code a été fait par un incapable, donc la je suis en train de faire variable par variable pour connaitre le vrai type.

    Le pire c'est que parfois sous matlab il a écrit "double" alors qu'en réalité c'est un int.

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par sazearte Voir le message
    Le pire c'est que parfois sous matlab il a écrit "double" alors qu'en réalité c'est un int.
    Code MATLAB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fid = fopen('data.bin', 'w');
    fwrite(fid, 5, 'long');
    fclose(fid);
     
    fid = fopen('data.bin', 'r');
    A = fread(fid, 1, 'long');
    frewind(fid);
    B = fread(fid, 1, '*long');
    fclose(fid);
     
    whos A B

    affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Name      Size            Bytes  Class     Attributes
     
      A         1x1                 8  double              
      B         1x1                 4  int32
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  16. #16
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    C'est bon, j'ai réussie a décoder entièrement le fichier.

    Y'a une chose que j'ai pas compris, parfois sous matlab il prenait 12 char, sous python j'était obliger de prendre des char non signer pour lire correctement le contenue, pourquoi ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 29/06/2012, 21h37
  2. Convertir fichier TEC en TXT
    Par loca67 dans le forum Windows 7
    Réponses: 0
    Dernier message: 20/06/2011, 10h15
  3. convertir fichier binaire en chaîne de caractères
    Par spake33 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 16/05/2011, 15h46
  4. [XL-2007] Code pour convertir fichier .xls en .txt
    Par christophe31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/03/2010, 14h59
  5. Réponses: 17
    Dernier message: 31/03/2009, 15h52

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