Pythonische Methode zum Hex-Dump von Dateien
Frage
meine Frage ist einfach:
Gibt es eine Möglichkeit, diesen Bash-Befehl pythonisch zu codieren?
hexdump -e '2/1 "%02x"' file.dat
Offensichtlich ohne Verwendung von OS, Popen oder einer Verknüpfung ;)
BEARBEITEN:Obwohl ich es nicht explizit angegeben habe, wäre es großartig, wenn der Code in Python3.x funktionsfähig wäre
Danke!
Lösung
Wenn Sie sich nur für Python 2.x interessieren, line.encode('hex')
kodiert einen Teil der Binärdaten in Hex.Also:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print chunk.encode('hex')
(IIRC, hexdump
druckt standardmäßig 32 Hexadezimalpaare pro Zeile;Wenn nicht, ändern Sie das einfach 32
Zu 16
oder was auch immer es ist…)
Wenn das Zwei-Argument iter
sieht verwirrend aus, klicken Sie auf den Hilfelink;Es ist nicht allzu kompliziert, wenn man erst einmal die Idee hat.
Wenn Sie sich für Python 3.x interessieren, encode
Funktioniert nur für Codecs, die Unicode-Zeichenfolgen in Bytes konvertieren.Alle Codecs, die umgekehrt konvertieren (oder eine andere Kombination), müssen Sie verwenden codecs.encode
um es explizit zu tun:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(codecs.encode(chunk, 'hex'))
Oder es ist vielleicht besser, es zu verwenden hexlify
:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(binascii.hexlify(chunk))
Wenn Sie etwas anderes tun möchten, als sie auszudrucken, anstatt die gesamte Datei in den Speicher einzulesen, möchten Sie wahrscheinlich einen Iterator erstellen.Sie könnten dies einfach in eine Funktion einfügen und das ändern print
zu einem yield
, und diese Funktion gibt genau den gewünschten Iterator zurück.Oder verwenden Sie einen genexpr oder map
Anruf:
with open('file.dat', 'rb') as f:
chunks = iter(lambda: f.read(32), b'')
hexlines = map(binascii.hexlify, chunks)
Andere Tipps
Die Standardbibliothek ist Ihr Freund.Probieren binascii.hexlify () .
einfach read()
die gesamte Dateiund encode('hex')
.Was könnte pythonischer sein?