【问题标题】:Reading binary files using python3使用python3读取二进制文件
【发布时间】:2019-09-25 10:02:29
【问题描述】:

我正在尝试在 python3 中读取 16 位二进制文​​件,但出现以下错误

out = struct.unpack("h", bytes)
错误:解包需要 2 个字节的缓冲区

import struct
for line in file_read:
    bytes = file_read.read(2)
    out = struct.unpack("h", bytes)
    file_write.write(str(out))

任何关于我可能出错的建议将不胜感激..

【问题讨论】:

    标签: python python-3.6 binaryfiles


    【解决方案1】:

    您正在按行和按字节字符遍历文件。

    for line in file_read:  # read by line
        bytes = file_read.read(2)  # read by character
    

    第一个寻找换行符(b'\n' aka b'\x0A')并且可能消耗任意数量的字节。这意味着您读取的字节对可能偏移 1,并且可能位于文件末尾。

    仅按字符对读取文件。您可以使用two-argument iterfor 循环中方便地执行此操作:

    for pair in iter(lambda: file_read.read(2), b''):
        out = struct.unpack("h", pair)
        file_write.write(str(out))
    

    在 Python 3.8 中,您也可以使用 assignment expression

    while pair := file_read.read(2):
        out = struct.unpack("h", pair)
        file_write.write(str(out))
    

    【讨论】:

    • 值得注意的是,如果file_read 是包含奇数字节的文件,这仍然可能引发相同的异常。但是,这将是输入的问题,而不是代码的问题。
    【解决方案2】:

    很可能file_read 是空的或在读取line 后变为空(正如@MisterMiyagi 所指出的,逐行读取二进制文件似乎不是一个好主意)。所以file_read.read 什么都不读或只读一个字节。您可以通过打印len(bytes)来验证它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 2021-12-04
      • 2019-04-13
      • 2020-11-11
      • 2012-09-11
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多