Pregunta

mi pregunta es simple:

¿Hay alguna forma de codificar de forma pitónica ese comando bash?

hexdump -e '2/1 "%02x"' file.dat

Obviamente, sin usar os, popen ni ningún atajo ;)

EDITAR:aunque no lo he especificado explícitamente, sería fantástico si el código fuera funcional en Python3.x

¡Gracias!

¿Fue útil?

Solución

Si solo te importa Python 2.x, line.encode('hex') codificará un trozo de datos binarios en hexadecimal.Entonces:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print chunk.encode('hex')

(IIRC, hexdump de forma predeterminada imprime 32 pares de hexadecimales por línea;si no, simplemente cambia eso 32 a 16 o lo que sea…)

Si los dos argumentos iter parece desconcertante, haga clic en el enlace de ayuda;No es demasiado complicado una vez que tienes la idea.

Si te interesa Python 3.x, encode sólo funciona para códecs que convierten cadenas Unicode a bytes;cualquier códec que convierta al revés (o cualquier otra combinación), debe usar codecs.encode para hacerlo explícitamente:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(codecs.encode(chunk, 'hex'))

O tal vez sea mejor usar hexlify:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(binascii.hexlify(chunk))

Si desea hacer algo además de imprimirlos, en lugar de leer el archivo completo en la memoria, probablemente desee crear un iterador.Podrías simplemente poner esto en una función y cambiar eso. print a un yield, y esa función devuelve exactamente el iterador que desea.O usar un genexpr o map llamar:

with open('file.dat', 'rb') as f:
    chunks = iter(lambda: f.read(32), b'')
    hexlines = map(binascii.hexlify, chunks)

Otros consejos

La biblioteca estándar es tu amigo.Pruebe binascii.hexlify () .

Simplemente read() El archivo completoy encode('hex') .¿Qué podría ser más Pythonic?

with open('file.dat', 'rb') as f:
    hex_content = f.read().encode('hex')

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top