manière pythonique de vider les fichiers en hexadécimal
Question
ma question est simple :
Existe-t-il un moyen de coder de manière pythonique cette commande bash ?
hexdump -e '2/1 "%02x"' file.dat
Évidemment, sans utiliser os, popen ou aucun raccourci ;)
MODIFIER:bien que je ne l'ai pas explicitement spécifié, ce serait génial si le code était fonctionnel dans Python3.x
Merci!
La solution
Si vous ne vous souciez que de Python 2.x, line.encode('hex')
encodera un morceau de données binaires en hexadécimal.Donc:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print chunk.encode('hex')
(IIRC, hexdump
par défaut, imprime 32 paires d'hexadécimaux par ligne ;sinon, change ça 32
à 16
ou quoi que ce soit…)
Si les deux arguments iter
cela semble déroutant, cliquez sur le lien d'aide ;ce n'est pas trop compliqué une fois qu'on a compris l'idée.
Si vous vous souciez de Python 3.x, encode
ne fonctionne que pour les codecs qui convertissent les chaînes Unicode en octets ;tous les codecs qui convertissent dans l'autre sens (ou toute autre combinaison), vous devez utiliser codecs.encode
pour le faire explicitement:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(codecs.encode(chunk, 'hex'))
Ou il serait peut-être préférable d'utiliser hexlify
:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(binascii.hexlify(chunk))
Si vous souhaitez faire autre chose que les imprimer, plutôt que de lire l'intégralité du fichier en mémoire, vous souhaiterez probablement créer un itérateur.Vous pouvez simplement mettre ceci dans une fonction et changer cela print
à un yield
, et cette fonction renvoie exactement l'itérateur souhaité.Ou utilisez un genexpr ou map
appel:
with open('file.dat', 'rb') as f:
chunks = iter(lambda: f.read(32), b'')
hexlines = map(binascii.hexlify, chunks)
Autres conseils
La bibliothèque standard est votre ami.Essayez binAcii.hexlify () .
Simplement read()
tout le fichieret encode('hex')
.Qu'est-ce qui pourrait être plus pythonique?
with open('file.dat', 'rb') as f:
hex_content = f.read().encode('hex')