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 :

Ecriture fichier binaire


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut Ecriture fichier binaire
    Bonjour,

    Je suis en train d'étudier le Python, mais j'ai un soucis lorsque je veux faire du traitement sur des fichiers binaires.
    Je ne comprend pas trop, malgré les tutoriels, comment cela fonctionne-t-il, car j'ai toujours des soucis de type de variables (Alors que je manipule que des octets).

    Voici mon code :
    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
    ### WRITE FILE ###
    def writeBinary(bFile, array_oct):
        mFile = open(bFile, "wb")
        for m_oct in array_oct:
            mFile.write(bytes(m_oct))
        mFile.close()
     
    adresse = 0xFF
    operation1 = 0x14
    operation2 = 0x80 + 10
     
    data = []
    data += [adresse, operation1]
    data += [adresse, operation2]
     
    writeBinary("filetest.cef", data)
    En faite, je construis une liste de valeurs "data" que je passe en paramètre de la fonction "writeBinary".

    Mais le fichier est remplis de 0 et pèse 668 octets.

    Pouvez vous m'aider?

  2. #2
    Membre du Club Avatar de chaying
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Salut,

    Tu as du faire une erreur dans l'execution de ton code. Ici, moi j'obtiens un fichier avec :
    ecrit dedans, ce qui correspond bien a :
    resultat obtenu dans le shell.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Salut

    A moins que tu ne sois pas dans la même version Python que moi (moi suis en v2.7) et que bytes() ou open() aient changés dans ta version, tout est ok dans ton code...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    En python 3 (que je ne connais pas bien), il me semble que le type bytes a été introduit pour faire un peu le ménage dans le type str où l'on pouvait indifféremment mettre des chaines "lisibles" et des octets au sens le plus général.

    Je ne pense pas que passer par un type bytes permette d'écrire des fichiers binaires (directement en tout cas).

    En 2.x, on pouvait, par exemple, passer par le module struct pour manipuler ce genre de fichiers. En version 3, est-ce toujours le cas ? Y-a-t-il autre chose ?

    Les 668 octets nuls que tu retrouves s'expliquent :

    In addition to the literal forms, bytes objects can be created in a number of other ways:
    • A zero-filled bytes object of a specified length: bytes(10)
    • From an iterable of integers: bytes(range(20))
    • Copying existing binary data via the buffer protocol: bytes(obj)
    (extrait de §4.8.1 Bytes)

    255 + 20 + 255 + 138 = 668 (octets "à zéro")

    [EDIT] dans la version 3, la documentation indique bien que struct manipule des bytes alors que dans les versions 2.x ça parle pudiquement de "string" sans plus de précision
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    En effet, j'obtiens maintenant 25520255138.
    Mais j'aimerai trouver 0xFF14FF8A en binaire dans mon fichier, et bien en mode binaire et non en chaîne de caractère.
    Que dois-je modifier ?

  6. #6
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Avant de poursuivre, la première chose à faire est de lever l'ambiguïté : avec quelle version travailles-tu ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Python 3.2

  8. #8
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    En effet, j'obtiens maintenant 25520255138.
    Non. Sans changer de version, ça ne peut pas donner une fois 668 octets nuls et une autre fois 25520255138 (et c'est heureux !)

    Et sous mon Linux, et sous MacOSX, en 3.2 ou 3.3, j'obtiens bien des octets nuls

    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
    Python 3.3.2 (v3.3.2:d047928ae3f6, May 13 2013, 13:52:24) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> f = open('data','wb')
    >>> for val in (255,20,255,138):
    ...     f.write(bytes(val))
    ... 
    255
    20
    255
    138
    >>> f.close()
    >>> 
    >>> import os
    >>> os.system('od -c data')
    0000000   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
    *
    0001220
    0
    C'est conforme au comportement que j'ai décrit dans un post précédent.

    A ta place, j'irais regarder du côté de struct.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  9. #9
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    cette façon de faire fonctionne en 2.7

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from struct import pack
    >>> f = open('data-2.7.3','wb')
    >>> values = (255,20,255,138)
    >>> f.write(pack('4B',*values))
    >>> f.close()
    >>> import os
    >>> _ = os.system('od -t x1 data-2.7.3')
    0000000 ff 14 ff 8a
    0000004
    >>>
    comme en 3.2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Python 3.2.3 (default, Oct 19 2012, 20:13:42) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from struct import pack
    >>> f = open('data-3.2.3','wb')
    >>> values = (255,20,255,138)
    >>> f.write(pack('4B',*values))
    4
    >>> f.close()
    >>> import os
    >>> _ = os.system('od -t x1 data-3.2.3')
    0000000 ff 14 ff 8a
    0000004
    >>>
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 83
    Points : 61
    Points
    61
    Par défaut
    Merci beaucoup pour ta réponse.
    Je vais donc continuer ma recherche sur le "struct".
    Merci aussi pour ton exemple, je comprend mieux le principe.

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

Discussions similaires

  1. Ecriture fichier binaire et vitesse
    Par uriotcea dans le forum C
    Réponses: 27
    Dernier message: 29/03/2013, 09h49
  2. Lecture et ecriture fichier binaire
    Par gedonet dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 20/04/2009, 19h51
  3. lecture ecriture fichier binaire
    Par jonckers dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/04/2007, 09h12
  4. Ecriture fichier binaire : Format TIFF
    Par xChRiSx dans le forum C++
    Réponses: 2
    Dernier message: 12/04/2007, 18h39
  5. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30

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