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 :

Ouvrir un fichier en mode binaire.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut [RESOLU] Ouvrir un fichier en mode binaire.
    Bonjour à tous...

    C'est une question qui est déjà tombée sur ce forum et ailleurs, et qui est (un peu) documentée dans la doc. Mais tous les essais que je fais se soldent immanquablement par des échecs...

    Mon problème est assez simple : je veux lire un fichier quelconque en binaire, et plus précisément pouvoir remplir une suite de listes [0..95] par les valeurs 0/1 (soit 12 octets dans ma liste).

    Après avoir importé les modules ad hoc, un classique :
    f = open (fichier, "rU")
    ou f = open (fichier, "rb")
    ne me donnent rien : si j'appelle f.read(1), il me renvoie un CHAR. Le mieux que j'arrive à faire, c'est prendre la valeur ASCII et la convertir en binaire, mais c'est lent et pas du tout satisfaisant. Et ça ne me permet pas d'écrire.

    Comment, donc, arriver à ouvrir en R (ou en W, mais pas en même temps) un fichier en mode binaire ? Et tout ça sous XP, Python 2.4.3.


    Merci à vous,

    Christophe

    P.S. : et encore, tout ça c'est après avoir réglé l'habituel problème du "from os import *" vx "import os"

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    le module struct devrait repondre à ton besoin.

    voilà, voilà....

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    J'ai déjà essayé le module binascii (également renseigné dans la doc python), mais sans résultat. En fait, ça marchait bien pour sortir de l'hexa, mais impossible d'obtenir quelque chose avec la fonction qui aurait du me renvoyer du binaire (a2b_base64, qui me renvoyait 'incorrect padding', de mémoire).

    J'ai donc récupéré une fonction qui me convertit un ord(char) en sa valeur binaire.

    Mais ce n'est pas ce que je veux... C'est trop lent, et ça ne marche qu'en lecture.
    Je veux ouvrir directement le fichier en binaire, càd, que read() me renvoie un 0/1. (Déjà que le type booléen n'existe pas... c'est pas gagné.)


    Merci...

    Christophe

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonjour,

    Ce qu'on entend généralement par fichier binaire, c'est un fichier ou les 256 valeurs de chaque octet sont utilisées directement pour encoder des données, par opposition aux fichiers textes où les données du fichier sont censées représenter des caractères et sont soumises à une interprétation (par exemple, caractère de fin de ligne, tabulation,...).

    Cela ne veut pas dire que le langage fournit un accès direct aux bits individuels, ce qui n'est jamais le cas (même en assembleur!), car la plus petite zone adressable en mémoire est l'octet. Il y a moyen de la faire en jonglant avec les opérations "bit à bit" (&, |, <<, >>, ~), mais ça ne sera pas super rapide en Python.

    Par exemple, on peut convertir le contenu du fichier entier en un seul entier très long (vu que la taille des entiers n'est pas limitée en Python) et utiliser les opérateurs mentionnés ci-dessus pour extraire les bits qui nous intéressent, mais il faut faire attention à ne pas perdre les bits à 0 en fin de fichier qui deviendraient les bits de poids fort de l'entier...

    Ah et le type booléen existe bien en Python ! Mais ne crois pas qu'un booléen soit encodé sur 1 bit ! (je ne sais pas exactement combien, mais ça ne m'étonnerait pas qu'il soit encodé sur 32 ou 64 bits).

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

    D'accord avec dividee: l'ouverture d'un fichier en "binaire" ne veut jamais dire qu'on a accès aux bits, mais qu'on n'interprète pas les caractères qui ont une signification particulière en édition de texte (retour charriot, tabulation, ...).


    Sur ce plan, Python fait son boulot et il suffit de le voir sur un petit exemple (j'ai pris une partie du 1er message):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    s="""C'est une question qui est déjà tombée sur ce forum et ailleurs, et qui est (un peu) documentée dans la doc. Mais tous les essais que je fais se soldent immanquablement par des échecs...
     
    Mon problème est assez simple : je veux lire un fichier quelconque en binaire, et plus précisément pouvoir remplir une suite de listes [0..95] par les valeurs 0/1 (soit 12 octets dans ma liste)."""
    Création d'un fichier contenant exactement les octets de la chaîne s (et pas plus):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f = open("ftest.txt",'wb')
    f.write(s)
    f.close()
    Après cela, on peut vérifier avec un éditeur hexadécimal que le contenu du fichier est bien l'exacte contenu de s en valeur et en longueur (nombre d'octets).

    Lecture du contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f = open("ftest.txt",'rb')
    x=f.read()
    f.close()
    On constate qu'on a récupéré l'exacte contenu du fichier en valeur et en longueur (nombre d'octets)

    Autre exemple, plus "binaire": on fabrique 1024 octets avec des valeurs d'octet au hasard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import random
     
    s=""
    for i in xrange(0,1024):
        c=random.randint(0,255)
        s+="%c" % c
    Si on applique les instructions précédentes, on voit qu'on récupère bien l'exacte contenu de la chaîne d'origine. Et on dispose en plus des facilités de traitement des chaines Python. Par exemple:
    => s[256:512] renvoie bien le 2ème paquet de 256 octets.
    => d=[ord(c) for c in list(s[256:512])] renvoie la même chose sous forme d'une liste d'octets convertis en entier.
    => sur les listes d'entiers, on peut faire tous les traitements binaires qu'on veut. Par exemple, for x in d: x = x>>1 divise par 2 tous les octets de la liste d'entier d.
    => "".join([chr(c) for c in d]) renvoie une chaîne à partir d'une liste d'entiers d
    etc...

    Après, si on veut faire un traitement binaire, on peut utiliser struct, mais on peut aussi développer toutes les fonctions qu'on veut. Python est tout de même très rapide.

    Tyrtamos

  6. #6
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    Quel est l'interêt de recuperer les valeurs binaires de chaque octet?
    Pour voir les bits contenus dans ton fichier?

    Pöur travailler sur les bits, tu n'as pas besoin d'obtenir une representation binaire sous forme de 0 et de 1 (True, False), tu peux simplement utiliser les operateurs binaires (& || )

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

Discussions similaires

  1. ouvrir un fichier en mode binaire ?
    Par rimas2009 dans le forum Général Java
    Réponses: 1
    Dernier message: 19/05/2009, 11h57
  2. [Linux] Ouvrir un fichier en mode append
    Par nelob dans le forum Assembleur
    Réponses: 1
    Dernier message: 06/04/2007, 17h13
  3. Ouvrir un fichier en mode lecture
    Par marwa_rades dans le forum Assembleur
    Réponses: 1
    Dernier message: 29/12/2006, 14h51
  4. ouverture/lecture/ecriture dans un fichier en mode binaire
    Par dirty_boy dans le forum Débuter
    Réponses: 2
    Dernier message: 15/03/2006, 08h38
  5. Réponses: 4
    Dernier message: 04/11/2005, 09h04

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