【问题标题】:converting a list with 0's and 1's to a bitarray (with bitarray module) and outputting to a binary file error将具有 0 和 1 的列表转换为位数组(使用位数组模块)并输出到二进制文件错误
【发布时间】:2016-07-11 17:24:07
【问题描述】:

我有一个独特的问题(至少据我在 SO 和谷歌搜索上花费的时间来看)。

我有一个包含 0 和 1 个不同列表长度的整数的列表,例如:

[0, 1, 0, 0 ,1, 0, 0, 0, 0, 0, 0...]

我正在将此列表转换为bitarray,如下所示:

from bitarray import bitarray
def binWise(sequence):
   newseq = bitarray(sequence)
   return newseq

这会返回格式如下的二进制输出:

b'01001000001'

但是,当我尝试将其作为二进制文件直接写入文件时,我得到了

TypeError: 'bitarray' does not support the buffer interface

有没有办法将二进制数据直接输出到二进制文件? 我根本不介意第 3 方模块的建议。但越简单越好。

【问题讨论】:

  • 你是用二进制模式打开文件吗?
  • @JonClements:这就是异常所暗示的,实际上。
  • 如果bitarray的长度不是8的倍数,你想发生什么?
  • 那么您希望写入文件的内容是什么? '0''1' 字符,还是每 8 位一个字节?例如,01001000 是十六进制的 0x48,或 ASCII 的 'H',因此在这种情况下您可以将 'H' 写入文件。

标签: python file binary output


【解决方案1】:

您需要使用以下方法之一来生成bytesstr 字符串对象:

  • .to01() 产生一个由'0''1' 字符组成的字符串。
  • .tobytes() 产生一个 bytes 对象,每个 8 位序列(一个字节)转换为 bytes 序列中的一个字节。 bitarray 被填充为 8 的倍数。
  • .tofile(f)bitarray 信息写入文件(以二进制模式),再次填充为 8 的倍数。

【讨论】:

    【解决方案2】:

    要将0和1打包成二进制位格式,可以使用numpy的packbits

    >>> import numpy as np
    >>> x = np.packbits([1, 0, 0, 0 , 0, 0, 0, 1])
    >>> x
    array([129], dtype=uint8)
    

    uint8 表示 numpy 将数据中的每个字节显示为无符号整数。

    这个数组可以写入文件:

    >>> with open('output.dat', 'wb') as f:
    ...    f.write(x)
    ... 
    

    Packbits 会将您的数据打包成所需的字节数。甚至不是 8 长的复用数据,也很容易处理:

    >>> x = np.packbits([1, 0, 0, 0 , 0, 0, 0, 1, 1, 1])
    >>> x
    array([129, 192], dtype=uint8)
    

    如您所见,第 9 位和第 10 位 1, 1 被放入从“高”位开始的第二个字节中。

    【讨论】:

    • 这很棒!非常感谢,我不知道 NumPy 有这个功能。
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 2021-12-05
    • 2013-03-13
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多