69 votes

lire des entiers à partir d'un fichier binaire en python

Je ne sais pas si la question du titre est correctement réglé. J'essaie de lire un fichier BMP en python. Je sais que les deux premiers octets indiquer le bmp entreprise. 4 octets sont la taille du fichier. Quand j'ai exécution:

fin = open("salut.bmp", "rb")
entreprise = fin.read(2) 
taille_fichier = int(fin.lire(4)) 

Je reçois

ValueError: invalid littéral pour int() avec la base 10: "F#\x13'

Ce que je veux faire, c'est la lecture de ces 4 octets comme un entier... Il semble que python est à les lire que les caractères et retourne une chaîne, qui ne peuvent être converties en un nombre entier. Comment puis-je faire cela correctement?
Merci!

109voto

codeape Points 38576

L' read méthode renvoie une séquence d'octets en une chaîne de caractères. Pour convertir une chaîne d'octets de la séquence de données binaires, utilisez le haut- struct module de: http://docs.python.org/library/struct.html.

import struct

print struct.unpack('i', fin.read(4))

Notez que unpack toujours retourne un tuple, alors struct.unpack('i', fin.read(4))[0] donne la valeur de l'entier que vous êtes après.

Vous devriez probablement utiliser la chaîne de format '<i' (< est un modificateur qui indique little-endian l'ordre des octets et la taille standard et l'alignement par défaut est d'utiliser la plate-forme de l'ordre des octets, la taille et l'alignement). Selon le format BMP spec, les octets doivent être écrits en Intel/little-endian ordre des octets.

39voto

Emanuel Ey Points 564

Une méthode alternative qui n'en fait pas usage d'une 'struct.unpack()' serait d'utiliser numpy:

import numpy as np

f = open("file.bin", "r")
a = np.fromfile(f, dtype=np.uint32)

'dtype" représente le type de données et peuvent être de type int#, uint#, float# complexe# ou un type défini par l'utilisateur. Voir: http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html

Personnellement, préférez l'utilisation de numpy pour travailler avec la matrice de matrice de données est beaucoup plus rapide que d'utiliser python listes.

6voto

Nick Dandoulakis Points 26809

Sauf struct vous pouvez également utiliser le module array

 import array
values = array.array('l') # array of long integers
values.read(fin, 1) # read 1 integer
file_size  = values[0]
 

4voto

Anurag Uniyal Points 31931

Lorsque vous lisez le fichier binaire, vous devez le décompresser en un entier, utilisez donc struct module pour cela.

 import struct
fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size, = struct.unpack("i",fin.read(4))
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: