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 (et affichage) d'un fichier binaire


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut lecture (et affichage) d'un fichier binaire
    Salut a tous:
    Simple question toute bête:
    Je souhaite ouvrir un fichier (ici une photo JPEG,mais ca pourrait être n'importe quoi) et me balader dedans.
    J'y arrive assez bien (fonction read,tell,seek), mais je n'arrive pas à afficher les octets lu sur mon batch.
    Le con essaye toujours de traduire en en caractere, alors que moi je ne veux que voir les octets...
    C'est quoi la commande ??
    Merci

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 939
    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 939
    Points : 7 348
    Points
    7 348
    Par défaut
    Etant donné que tu ne dis pas ce que tu as essayé pour lire ton fichier, je me permet de commencer par la base.

    Pour lire un fichier binaire type JPEG ou EXE ou autres...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f=open('fichier.txt', 'rb') # où le b veut dire binary
    La doc officielle :

    On Windows, 'b' appended to the mode opens the file in binary mode, so there are also modes like 'rb', 'wb', and 'r+b'. Python on Windows makes a distinction between text and binary files; the end-of-line characters in text files are automatically altered slightly when data is read or written. This behind-the-scenes modification to file data is fine for ASCII text files, but it’ll corrupt binary data like that in JPEG or EXE files. Be very careful to use binary mode when reading and writing such files. On Unix, it doesn’t hurt to append a 'b' to the mode, so you can use it platform-independently for all binary files.
    Car évidemment le fait de savoir si tu es sur UNIX ou Windows est important.

    La version python aussi tu me diras.

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Salut,



    Est-ce que ceci t’apporte quelque chose ? :

    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
    22
    23
    24
    25
    26
    from binascii import hexlify
     
    print 4*('dec   hex  repr       ')+'\n-'+4*'--------------------'
    print '\n'.join( '   |   '.join('  '.join((str(i).rjust(3),
                                               hex(i).rjust(4),
                                               repr(chr(i))[1:-1].rjust(4)))
                                    for i in xrange(j,min(j+4,256)))
                     for j in xrange(0,256,4))
     
     
     
     
    ch = chr(12)+' \x21'+'!'+'$0:<a~'+'\xba'
     
    with open('ooct','w') as f:
        f.write(ch)
     
    with open('ooct') as f:
        ch = f.read()
     
    print "\nchaine definie par ch =  chr(12)+' \\x21'+'!'+'$0:<a~'+'\\xba'"
    print ch
    print repr(ch)
    print map(ord,ch)
    print map(hex,map(ord,ch))
    print map(hexlify,ch)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    hello
    Alors oui, désolé de ne pas avoir spécifié:

    je fais bien:
    f=open('totot','rb')
    Et j'arrive a appliquer à mon fichier les fonction read et seek par exemple.

    MAintenant je voudrais AFFICHER sur le batch les octet lu par f.read(x)

    le probleme avec print c'est qu'il essaye de convertir les octets lu en caractere alfanumérique (avec je ne sais quelle encodage) et donc ca écrit une chaine de n'importequoi...

    C'est plus claire?

    Pour la version python 2.6
    pour linux/windows: Les deux mon général

  5. #5
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Hmmm... mais les octets sont bien affichés ^^, mais en fait tu voudrais, si j'ai bien compris, les afficher visuellement sous une autre forme, c'est bien ça ?

    Si c'est bien cela, alors, c'est très con, faut convertir le caractère en entier via ord(), et puis de le convertir en hex via hex() ou binaire via bin(), mais voici un code qui te montre un peu l'esprit :
    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
    22
    23
    24
    >>> def readInt(f_in, octet=0):
    	if octet:
    		it= (ord(x) for x in f_in.read(octet))
    	else :
    		it= (ord(x) for x in f_in.read())
    	r=0
    	for x in it:
    		r=(r<<8)+x
    	return r
     
    >>> def readHex(f_in, octet=0):
    	r=hex(readInt(f_in,octet))[2:].replace('L','')
    	return ('0' if len(r)%2 else '') + r
     
    >>> readHex(file('D:\\toto.bak'),2)
    '746f'
    >>> readHex(file('D:\\toto.bak'))
    '746f746f0a746174610a74697469'
    >>> def readBin(f_in, octet=0):
    	r=bin(readInt(f_in,octet))[2:].replace('L','')
    	return ('0'*(8-(len(r)%8)))+r
     
    >>> readBin(file('D:\\toto.bak'),1)
    '01110100'

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 939
    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 939
    Points : 7 348
    Points
    7 348
    Par défaut
    Essai ceci, mais je suis pas sur de comprendre, cependant il existe une différence entre ce code qui m'envoie des lettres bizarres et le code suivant qui me donne des codes qui me permettraient de traiter avec un encodage.

    Le code qui fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f=open('test.jpg', 'rb')
    data=f.read(50)
    print data
    Et le code qui m'a l'air pas mal, mais tu me diras si c'est ça que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f=open('test.jpg', 'rb')
    print [f.read(i) for i in xrange(51)]
    f.close()

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    PArfait!
    Merci beaucoup!
    Alors les 2 méthodes donnes des résultats interessant (et heureusement comparable).
    je comprend bien ce que fais N.tox (j'aurai du y penser tout seul d'ailleur mais bon...)

    Par contre pour fred, j'avais exactement pareil que toi pour le premier essai, et tu as toi aussi constater que ca ne marche pas...Par contre à premiere vu je ne comprend pas du tout pourquoi ca fonctionne dans le second. A creuser.

    En tout cas merci beaucoup à tous les deux.
    Même si tout n'est pas encore claire, j'ai largement matiere a réfléchir et en tout cas je peux lire mes trucs. Je considere donc le topic comme résolu
    Bravo

    Julien

    PS: Du coup je viens de regarder le code de Eyquem qui a aussi apparement répondu à ma question, mais ca avais un aspect tellement bizzare que j'avais zappé en premiere lecture. Merci a toi donc aussi

  8. #8
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Bonjour à tout le monde,
    le module binascii fait cela également:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from __future__ import with_statement
    import binascii
     
    with open('/bin/ls', 'rb') as f:
      d = f.read()
    >>> print d[0:64]
    ELF@�4`d4(44�
    >>> print binascii.hexlify(d[0:64])
    7f454c460101010000000000000000000200030001000000409a040834000000606401000000000034002000080028001b001a00060000003400000034800408

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

Discussions similaires

  1. Bogue lors de lecture et affichage d'un fichier .DOC
    Par aderfat dans le forum Débuter
    Réponses: 2
    Dernier message: 12/06/2012, 09h37
  2. Réponses: 17
    Dernier message: 30/03/2011, 16h23
  3. lecture et interprétation d'un fichier binaire
    Par mad_dream dans le forum LabVIEW
    Réponses: 3
    Dernier message: 28/04/2010, 17h52
  4. [fichier binaire]lecture ecriture dump
    Par parsy dans le forum Langage
    Réponses: 7
    Dernier message: 10/08/2005, 19h40
  5. Réponses: 5
    Dernier message: 03/06/2005, 15h06

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