有没有一种简单的方法,在 Python 中将文件的十六进制数据读入一个列表,例如 hex
?
那么 hex
就是这样的:
hex = ['AA','CD','FF','0F']
我不想先读入字符串,然后再拆分。对于大文件来说,这会占用很多内存。
有没有一种简单的方法,在 Python 中将文件的十六进制数据读入一个列表,例如 hex
?
那么 hex
就是这样的:
hex = ['AA','CD','FF','0F']
我不想先读入字符串,然后再拆分。对于大文件来说,这会占用很多内存。
s = "Hello"
hex_list = ["{:02x}".format(ord(c)) for c in s]
输出
['48', '65', '6c', '6c', '6f']
只需将 s
更改为 open(filename).read()
,您就会得到预期的结果。
with open('/path/to/some/file', 'r') as fp:
hex_list = ["{:02x}".format(ord(c)) for c in fp.read()]
如果您不想一次性将整个列表存储在内存中以处理大文件。
hex_list = ("{:02x}".format(ord(c)) for c in fp.read())
并且要获取这些值,请继续调用
next(hex_list)
获取生成器中的所有剩余值
list(hex_list)
[ ]
改成 ( )
。目前它叫做列表生成式。改成括号,你就得到了生成器生成式。 - OneCricketeernext
函数调用放在try..except StopIteration
语句块内。 - Steinar Limafp.read()
不是已经将整个输入文件读入内存了吗?另外:如果文件是纯二进制数据序列(我刚试过给定的数字),你可能会得到错误 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 0: invalid start byte
,因为你以 text
模式打开文件。我正在使用 Python 3。 - Pynchia使用Python 3,假设输入文件包含您展示的样本字节。例如,我们可以这样创建它:
>>> inp = bytes((170,12*16+13,255,15)) # i.e. b'\xaa\xcd\xff\x0f'
>>> with open(filename,'wb') as f:
... f.write(inp)
现在,考虑到我们想要得到输入文件中每个字节的十六进制表示,最好以二进制模式打开文件,而不是尝试将其内容解释为字符/字符串(否则我们可能会遇到错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 0: invalid start byte
)。
>>> with open(filename,'rb') as f:
... buff = f.read() # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format(b) for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
请注意,对于查看文件的十六进制转储,大多数操作系统都提供了实用程序。如果你只想进行十六进制转储,请考虑使用以下程序之一:
od
(八进制转储,具有-x
或-t x
选项)hexdump
xd
实用程序