Python:如何将文件中的十六进制读入列表?

10

有没有一种简单的方法,在 Python 中将文件的十六进制数据读入一个列表,例如 hex

那么 hex 就是这样的:

hex = ['AA','CD','FF','0F']

我不想先读入字符串,然后再拆分。对于大文件来说,这会占用很多内存。


1
你那里有一个元组,而不是一个列表。 - jsfan
2
这不是一个确切的答案,但可能会指引你朝着正确的方向前进。 - James H
你想将文件数据作为字符串还是整数呢?你的示例输出是将每个字节作为两个十六进制字符的字符串,但这似乎不如整数列表有用。 - e0k
这可能是一个有用的问题和答案页面:https://dev59.com/LXNA5IYBdhLWcg3wQ7Yw。 - Pynchia
3个回答

13
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)

1
抱歉,我对Python有点陌生...请解释一下@cricket_007 - Joseph
2
[ ] 改成 ( )。目前它叫做列表生成式。改成括号,你就得到了生成器生成式。 - OneCricketeer
1
@bytec0de 请确保将next函数调用放在try..except StopIteration语句块内。 - Steinar Lima
请原谅我的无知:fp.read() 不是已经将整个输入文件读入内存了吗?另外:如果文件是纯二进制数据序列(我刚试过给定的数字),你可能会得到错误 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 0: invalid start byte,因为你以 text 模式打开文件。我正在使用 Python 3。 - Pynchia
@Pynchia 对于将文件读入内存,你说得没错,但是列表的内存会增加一倍,因为需要存储文件内容和列表本身。此外,我不确定文本模式和二进制模式之间的区别,还没有尝试过。 - OneCricketeer
显示剩余2条评论

8

使用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']

如果文件很大,我们可能想要逐个字符或分块读取。为此,我建议阅读这个问答来进行学习。

1

请注意,对于查看文件的十六进制转储,大多数操作系统都提供了实用程序。如果你只想进行十六进制转储,请考虑使用以下程序之一:

  • od(八进制转储,具有-x-t x选项)
  • hexdump
  • 在Windows下可用的xd实用程序
  • 在线十六进制转储工具,例如this one

1
我需要纯Python实现 ;) - Joseph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接