如何一次性从字节文件中读取整数?

0 投票
3 回答
2624 浏览
提问于 2025-04-18 11:20

我想用Python读取一个.yuv文件里的数据。这些数据是无符号的8位整数,也就是uint8类型。我用这样的命令:

fp = open(filename, 'rb')
data = fp.read(100)

这样我会得到100个字节的数据,形式是一个字符串。我知道可以用ord()这个函数把1个字节的字符串转换成1个整数。那么,有没有办法一次性把这100个字节的数据转换成100个整数,放到一个数组里呢?

3 个回答

0

你可以使用列表推导式来把所有的内容转换过来:

data = [ord(b) for b in fp.read(100)]
1

你可能还想用一下 numpy

import numpy as np

with open(filename, 'rb') as fp:
    integers = numpy.fromstring(fp.read(100), dtype='uint8')

这样说起来更简单(而且可能在内存使用上更高效):

integers = numpy.fromfile(filename, dtype='uint8')

当然,如果你只有100个或1000个整数,那用 struct 的方法就很好,不需要额外的模块。但如果你要处理大量数据,并且想对这些数据进行一些数学运算,numpy.array 是一个非常有用的数据类型。numpy 数组可以处理高达几GB的数据,而且性能还不错。

如果你有大文件,可以考虑使用 numpy.memmap。它的好处在于,它实际上并不会把数组完全加载到内存中。这样在随机访问时非常方便,因为数组只有在需要时才会被加载。对于顺序访问来说就没那么好了,因为操作系统会通过预读缓存等技术来优化顺序访问。对于随机访问或者只访问数组的一小部分,大数组的表现是很难被超越的。

2

使用 struct.unpack

with open(filename, 'rb') as fp:
    integers = struct.unpack('100B', fp.read(100))

撰写回答