如何阅读简单的二进制文件

时间:2014-03-13 14:10:48

标签: python

我有一个二进制文件,由固定长度和相等长度的连续二进制子序列组成。每个子序列都可以解压缩为相同数量的值。我知道每个子序列的长度和值的二进制格式。

  

如何处理二进制文件,删除子序列,   解压缩他们的内容并在我去的时候将其写成csv。

我知道如何写出csv。我的问题是从文件和解包部分读取。这是我的非工作代码。

import csv
import sys
import struct
writer = csv.writer(sys.stdout, delimiter=',', quoting=csv.QUOTE_NONE,escapechar='\\')  
?  rows = sys.stdin. ?
?  header = id, time ....
? write the header with csv
i = 0
for row in rows:
    unpacked_row = unpack('QqqqddiBIBcsbshlshhlQB',row)
    writer.writerow(unpacked_row)
    i += 1

使用Reading binary file in Python and looping over each byte的可能解决方案和ignacio的答案。

首先计算chunksize = struct.calcsize()

def bytes_from_file(filename, chunksize=8192):
    with open(filename, "rb") as f:
        while True:
            chunk = f.read(chunksize)
            if chunk:
                yield chunk
            else:
                break

# example:
for chunk in bytes_from_file('filename'):
#        row = unpack(chunk)
#        write out row as csv

2 个答案:

答案 0 :(得分:1)

您需要计算结构的大小(提示:struct.calcsize())并一次从文件中读取其中的一些。您不能像使用文本文件那样直接迭代输入,因为没有分隔符。

答案 1 :(得分:1)

您可以使用struct.Struct解压缩文件中的值:

#!/usr/bin/env python
import csv
import sys
from struct import Struct

record = Struct('QqqqddiBIBcsbshlshhlQB')
with open('input_filename', 'rb') as file:
    writer = csv.writer(sys.stdout, quoting=csv.QUOTE_NONE, escapechar='\\')
    while True:
        buf = file.read(record.size)
        if len(buf) != record.size: 
            break
        writer.writerow(record.unpack_from(buf))

您也可以将while - 循环编写为:

from functools import partial

for buf in iter(partial(file.read, record.size), b''):
    writer.writerow(record.unpack_from(buf))