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!

Était-ce utile?

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')

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top