CommentCaMarche
Recherche
Posez votre question Signaler

[PYTHON] Lire/écrire un fichier binaire

Christophe - Dernière réponse le 11 mai 2008 à 17:26
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 un échec.
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..99] par les valeurs 0/1.
Un classique :
f = open (fichier, "rU")
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
Lire la suite 
Réponse
+0
moins plus
Salut,

char ou octet c'est la même chose en python. En réalité tu ouvres bien tonfichier en binaire et read() t renvoie les valeurs en octet. Si tu affiches avec un print il remplacera les octets en caractères quand il pourra.

La conversion de ces octets sous forme de chaine composée de 1 et 0, c'est un truc que tu ne peux faire que manuellement.
Christophe- 11 mai 2008 à 12:05
All right.

Lire un fichier en binaire, c'est lire tous les CHAR, non interprétés. Je vais lire CHAR(13), par exemple, et pas \n. Je viens de le comprendre :)
Et effectivement, à partir de là, je dois convertir en binaire tous mes ORD(char)... snif :)

Merci.


##
Christophe
Répondre
kilian 8903Messages postés vendredi 19 septembre 2003Date d'inscription ModérateurStatut 1 août 2014Dernière intervention - 11 mai 2008 à 12:20
Non c'est pas ça.
Tu lis ton fichier et là tu as une suite d'octet. En faisant un print dessus, tu verras la représentation sous forme de char ou bien sous forme hexadécimale s'il n'arrive pas à trouver de code ascii correspondant à l'octet.

Si tu veux une représentation sous forme binaire, c'est à toi de la programmer. Mais ça n'est qu'une représentation.
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Si j'exécute :

fichier = "document.txt"
f = open (fichier, "rU")
while (1):
tampon = f.read(1)
if tampon == "": break
print tampon
print type(tampon)

Tu verras que le type tampon, qu'il lit dans le fichier ouvert en mode rU, c'est STR. Il lit une chaîne de caractères. D'ailleurs, tu peux aussi demander f.read(n), avec n caractères à lire.

Je ne comprends pas ce que tu veux dire quand tu dis que le CHAR (ou le code hexa) affiché n'est qu'une représentation... ?


##
Christophe
kilian 8903Messages postés vendredi 19 septembre 2003Date d'inscription ModérateurStatut 1 août 2014Dernière intervention - 11 mai 2008 à 12:39
Oui c'est un str, read retourne toujours un str.

Un octet est une valeur et cette valeur tu peux la représenter de diverses manière. Exemple si c'est 128 en décimal, ça donnera 0x80 en hexa, 1000 0000 en binaire etc...

Pour plus de simplicité, python l'affiche en hexa, voire en char s'il trouve une correspondance ascii de la valeur.
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Moui c'est vrai qu'avec python, les variables ne sont pas déclarées. Ca m'a toujours gêné, ça.
Mais pour moi, un STR, c'est un STR ! C'est composé d'une suite de CHAR, qui sont eux même des valeurs ASCII [0..255] codées sur un octet.

C'est sûr qu'en mémoire, c'est toujours la même chose, mais c'est interprété différement. Enfin, je ne comprends toujours pas cette distinction... ?


##
Christophe
Ajouter un commentaire
Réponse
+0
moins plus
C'est sûr qu'en mémoire, c'est toujours la même chose, mais c'est interprété différement. Enfin, je ne comprends toujours pas cette distinction... ?

Tu l'as dit: c'est interprété différemment.

Quand tu lis un fichier binaire, la valeur 65 peut être le caractère A, ou un pixel bleu ou une note de musique... tout dépend de l'interprétation que tu en fera.

Mais ce n'est pas Python qui peut savoir: C'est le programmeur qui va donner un sens à ces octets. :-)
Ajouter un commentaire
Ce document intitulé «  [PYTHON] Lire/écrire un fichier binaire  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.