我有一个二进制文件,由固定长度和相等长度的连续二进制子序列组成。每个子序列都可以解压缩为相同数量的值。我知道每个子序列的长度和值的二进制格式。
如何处理二进制文件,删除子序列, 解压缩他们的内容并在我去的时候将其写成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
答案 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))