当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中将二进制文件读取为十六进制?

如何解决《如何在Python中将二进制文件读取为十六进制?》经验,为你挑选了1个好方法。

我想读取一个带有数据的文件,以十六进制格式编码:

01ff0aa121221aff110120...etc

文件包含> 100.000这样的字节,一些超过1.000.000(它们来自DNA测序)

我尝试了以下代码(和其他类似的代码):

filele=1234563
f=open('data.geno','r')
c=[]
for i in range(filele):
  a=f.read(1)
  b=a.encode("hex")
  c.append(b)
f.close()

这给每个字节分别"aa""01""f1"等,这对我来说是完美的!

这可以正常工作(在这种情况下)字节no 905碰巧是"1a".我也尝试了在同一个字节停止的ord()函数.

可能有一个简单的解决方案?



1> ShadowRanger..:

简单的解决方法是binascii:

import binascii

# Open in binary mode (so you don't read two byte line endings on Windows as one byte)
# and use with statement (always do this to avoid leaked file descriptors, unflushed files)
with open('data.geno', 'rb') as f:
    # Slurp the whole file and efficiently convert it to hex all at once
    hexdata = binascii.hexlify(f.read())

这只是给你一个str十六进制值,但它比你想要做的快得多.如果你真的想要每个字节有一堆长度为2的十六进制字符串,你可以轻松转换结果:

hexlist = map(''.join, zip(hexdata[::2], hexdata[1::2]))

这将产生str对应于每个字节的十六进制编码的len 2 的列表.为了避免临时副本hexdata,您可以使用类似但稍微不那么直观的方法,通过使用相同的迭代器两次避免切片zip:

hexlist = map(''.join, zip(*[iter(hexdata)]*2))

更新:

对于Python 3.5及更高版本的人来说,bytes对象产生了一个.hex()方法,因此不需要模块将原始二进制数据转换为ASCII十六进制.顶部的代码块可以简化为:

with open('data.geno', 'rb') as f:
    hexdata = f.read().hex()

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有