Python-从二进制文件读取10位整数

让·巴蒂斯特·马丁(Jean-Baptiste Martin)

我有一个包含10位整数流的二进制文件。我想阅读并将值存储在列表中。

它与以下代码一起使用,该代码读取my_file并填充pixels整数值:

file = open("my_file", "rb")

pixels = []
new10bitsByte = ""

try:
    byte = file.read(1)
    while byte:
        bits = bin(ord(byte))[2:].rjust(8, '0')
        for bit in reversed(bits):
            new10bitsByte += bit
            if len(new10bitsByte) == 10:
                pixels.append(int(new10bitsByte[::-1], 2))
                new10bitsByte = ""             
    byte = file.read(1)

finally:
    file.close()

将字节读为位,然后将其读回为“ 10位”字节似乎不太好。有更好的方法吗?

使用8或16位整数,我可以直接使用file.read(size)并将结果转换为int。但是在这里,由于每个值都存储在1.25个字节中,因此我需要类似file.read(1.25)...

2号环

这是一个不使用文本字符串转换就执行位操作的生成器。希望它会更有效率。:)

为了对其进行测试,我将range(1024)中的所有数字都写入了BytesIO流,其行为类似于二进制文件。

from io import BytesIO

def tenbitread(f):
    ''' Generate 10 bit (unsigned) integers from a binary file '''
    while True:
        b = f.read(5)
        if len(b) == 0:
            break
        n = int.from_bytes(b, 'big')

        #Split n into 4 10 bit integers
        t = []
        for i in range(4):
            t.append(n & 0x3ff)
            n >>= 10
        yield from reversed(t)

# Make some test data: all the integers in range(1024),
# and save it to a byte stream
buff = BytesIO()

maxi = 1024
n = 0
for i in range(maxi):
    n = (n << 10) | i
    #Convert the 40 bit integer to 5 bytes & write them
    if i % 4 == 3:
        buff.write(n.to_bytes(5, 'big'))
        n = 0

# Rewind the stream so we can read from it
buff.seek(0)

# Read the data in 10 bit chunks
a = list(tenbitread(buff))

# Check it 
print(a == list(range(maxi)))    

输出

True

这样做list(tenbitread(buff))是将生成器输出转换为列表的最简单方法,但是您可以轻松地遍历值,例如

for v in tenbitread(buff):

或者

for i, v in enumerate(tenbitread(buff)):

如果需要索引以及数据值。


这是生成器的小端版本,其结果与您的代码相同。

def tenbitread(f):
    ''' Generate 10 bit (unsigned) integers from a binary file '''
    while True:
        b = f.read(5)
        if not len(b):
            break
        n = int.from_bytes(b, 'little')

        #Split n into 4 10 bit integers
        for i in range(4):
            yield n & 0x3ff
            n >>= 10

我们可以通过“展开” for循环来稍微改进此版本,这使我们摆脱了最终的遮罩和移位操作。

def tenbitread(f):
    ''' Generate 10 bit (unsigned) integers from a binary file '''
    while True:
        b = f.read(5)
        if not len(b):
            break
        n = int.from_bytes(b, 'little')

        #Split n into 4 10 bit integers
        yield n & 0x3ff
        n >>= 10
        yield n & 0x3ff
        n >>= 10
        yield n & 0x3ff
        n >>= 10
        yield n 

应该给更多的速度...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中从二进制文件读取4个字节的整数

来自分类Dev

在python中读取二进制文件时的偏移

来自分类Dev

Python读取Fortran二进制文件

来自分类Dev

使用Python 3.5从二进制文件读取

来自分类Dev

在 Python 上读取二进制文件

来自分类Dev

读取用 Python 编写的 Fortran 二进制文件

来自分类Dev

R和python读取二进制文件的区别

来自分类Dev

如何在python中读取二进制文件并将其转换为整数数组?

来自分类Dev

(从位串)写入位以在python中创建二进制文件

来自分类Dev

Python二进制文件。

来自分类Dev

写入二进制文件python

来自分类Dev

以读取模式读取二进制文件 Python 3 - 在 Windows 上通过,在 Linux 上失败

来自分类Dev

从二进制文件C ++读取16位整数

来自分类Dev

Python认为以二进制读取方式打开文件时文件为空

来自分类Dev

读取\ xHH从文件中转义为Python中的原始二进制文件

来自分类Dev

Python认为以二进制读取方式打开文件时文件为空

来自分类Dev

使用 int (python) 读取日志数据的二进制文件并输出到新文件

来自分类Dev

将二进制文件中的 64 位浮点值导入 python

来自分类Dev

Python 将二进制字符串转换为二进制整数

来自分类Dev

Python 3.6:读取非空二进制文件被 Python 解释为空

来自分类Dev

如何从 python 读取这个二进制文件,并提供二进制文件、文本文件和代码?

来自分类Dev

在python中将整数转换为大端字节二进制文件

来自分类Dev

直接在python中将二进制文件转换为整数数组?

来自分类常见问题

Python:从stdin读取和写入Powershell中的二进制文件

来自分类Dev

用python创建查找表,写入可在C程序中读取的二进制文件

来自分类Dev

使用Python模块fileinput读取多个二进制文件的单个字节

来自分类Dev

python从二进制文件读取16个字节长的双

来自分类Dev

Python-读取具有偏移量和结构的二进制文件

来自分类Dev

读取并显示python中的二进制图像文件

Related 相关文章

  1. 1

    在Python中从二进制文件读取4个字节的整数

  2. 2

    在python中读取二进制文件时的偏移

  3. 3

    Python读取Fortran二进制文件

  4. 4

    使用Python 3.5从二进制文件读取

  5. 5

    在 Python 上读取二进制文件

  6. 6

    读取用 Python 编写的 Fortran 二进制文件

  7. 7

    R和python读取二进制文件的区别

  8. 8

    如何在python中读取二进制文件并将其转换为整数数组?

  9. 9

    (从位串)写入位以在python中创建二进制文件

  10. 10

    Python二进制文件。

  11. 11

    写入二进制文件python

  12. 12

    以读取模式读取二进制文件 Python 3 - 在 Windows 上通过,在 Linux 上失败

  13. 13

    从二进制文件C ++读取16位整数

  14. 14

    Python认为以二进制读取方式打开文件时文件为空

  15. 15

    读取\ xHH从文件中转义为Python中的原始二进制文件

  16. 16

    Python认为以二进制读取方式打开文件时文件为空

  17. 17

    使用 int (python) 读取日志数据的二进制文件并输出到新文件

  18. 18

    将二进制文件中的 64 位浮点值导入 python

  19. 19

    Python 将二进制字符串转换为二进制整数

  20. 20

    Python 3.6:读取非空二进制文件被 Python 解释为空

  21. 21

    如何从 python 读取这个二进制文件,并提供二进制文件、文本文件和代码?

  22. 22

    在python中将整数转换为大端字节二进制文件

  23. 23

    直接在python中将二进制文件转换为整数数组?

  24. 24

    Python:从stdin读取和写入Powershell中的二进制文件

  25. 25

    用python创建查找表,写入可在C程序中读取的二进制文件

  26. 26

    使用Python模块fileinput读取多个二进制文件的单个字节

  27. 27

    python从二进制文件读取16个字节长的双

  28. 28

    Python-读取具有偏移量和结构的二进制文件

  29. 29

    读取并显示python中的二进制图像文件

热门标签

归档