طريقة بيثونيك لملفات تفريغ عرافة
سؤال
سؤالي بسيط:
هل هناك أي طريقة لرمز بطريقة بيثونيك أن الأمر باش?
hexdump -e '2/1 "%02x"' file.dat
من الواضح ، دون استخدام نظام التشغيل ، بوبين ، أو أي اختصار؛)
تحرير:على الرغم من أنني لم تحدد صراحة ، سيكون كبيرا إذا كان رمز وظيفية في بيثون 3.x
شكراً!
المحلول
إذا كنت تهتم فقط بيثون 2.x, line.encode('hex')
سوف ترميز قطعة من البيانات الثنائية إلى عرافة.لذا:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print chunk.encode('hex')
(إيرك, hexdump
افتراضيا يطبع 32 زوجا من عرافة في كل سطر;إذا لم يكن كذلك ، فقط قم بتغيير ذلك 32
إلى 16
أو أيا كان...)
إذا كانت الحجة اثنين iter
يبدو محيرا ، انقر فوق رابط المساعدة;انها ليست معقدة جدا بمجرد الحصول على هذه الفكرة.
إذا كنت تهتم بيثون 3.x, encode
يعمل فقط لبرامج الترميز التي تحول سلاسل يونيكود إلى بايت;أي برامج الترميز التي تحول العكس (أو أي تركيبة أخرى) ، لديك لاستخدام codecs.encode
للقيام بذلك صراحة:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(codecs.encode(chunk, 'hex'))
أو قد يكون من الأفضل استخدام hexlify
:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(binascii.hexlify(chunk))
إذا كنت تريد أن تفعل شيئا إلى جانب طباعتها ، بدلا من قراءة الملف بأكمله في الذاكرة ، وربما كنت تريد أن تجعل مكرر.هل يمكن أن مجرد وضع هذا في وظيفة وتغيير ذلك print
إلى أ yield
, ، وهذه الوظيفة ترجع بالضبط المكرر الذي تريده.أو استخدام جينيكسر أو map
اتصل:
with open('file.dat', 'rb') as f:
chunks = iter(lambda: f.read(32), b'')
hexlines = map(binascii.hexlify, chunks)
نصائح أخرى
المكتبة القياسية هي صديقك.جرب binascii.hexlify () .
ببساطة read()
الملف كله و encode('hex')
.ماذا يمكن أن يكون أكثر بيثونيك?
with open('file.dat', 'rb') as f:
hex_content = f.read().encode('hex')