Rechercher : dans
Par :

[PYTHON] Lire/écrire un fichier binaire

Dernière réponse le 11 mai 2008 à 17:26:11 Christophe, le 10 mai 2008 à 16:53:39 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [PYTHON] Lire/écrire un fichier binaire » dans :
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Lire un fichier en .rbs VoirOn peut rencontrer parfois des fichiers en .rbs, issus d'un enregistrement ou un autre. La solution la plus simple pour lire ces fichiers est tout bêtement de remplacer l'extension .rbs par .mp3 Si vous ne voyez pas l'extension du fichier, faites...
Fichier BIN VoirFormat BIN Les fichiers BIN et CUE sont respectivement : .BIN : une image de CD, c'est-à-dire une copie binaire d'un CD ou d'un DVD sous forme d'un fichier .CUE : informations sur les pistes du disque. Comment lire un fichier BIN ? Les...
Fichier PRN VoirFormat PRN Un fichier PRN (contraction de PRiNt) est un fichier d'impression, c'est-à-dire un fichier contenant les données binaires telles qu'elles doivent être envoyées à une imprimante. Comment lire un fichier PRN ? Pour ouvrir un tel fichier,...

1

kilian, le 10 mai 2008 à 19:51:38

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.

Répondre à kilian

2

Christophe, le 11 mai 2008 à 12:05:41

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 à Christophe

3

kilian, le 11 mai 2008 à 12:20:18

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 à kilian

4

Christophe, le 11 mai 2008 à 12:26:27

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

Répondre à Christophe

5

kilian, le 11 mai 2008 à 12:39:37

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 à kilian

6

Christophe, le 11 mai 2008 à 13:57:00

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

Répondre à Christophe

7

 sebsauvage, le 11 mai 2008 à 17:26:11

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. :-)

Répondre à sebsauvage
Collection CommentÇaMarche.net