[PYTHON] Lire/écrire un fichier binaire

Fermé
Christophe - 10 mai 2008 à 16:53
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 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
A voir également:

4 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 mai 2008 à 19:51
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.
0
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
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > Christophe
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.
0
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
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
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.
0
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
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
11 mai 2008 à 17:26
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. :-)
0