Python 如何读取简单的二进制文件
我有一个二进制文件,它由固定长度和相等长度的连续二进制子序列组成。每个子序列可以解压成相同数量的值。我知道每个子序列的长度和值的二进制格式 如何处理二进制文件,切掉子序列, 解包他们的内容,并写出来作为csv作为我去 我知道如何写csv。我的问题是读取文件和解包部分。这是我的非工作代码Python 如何读取简单的二进制文件,python,Python,我有一个二进制文件,它由固定长度和相等长度的连续二进制子序列组成。每个子序列可以解压成相同数量的值。我知道每个子序列的长度和值的二进制格式 如何处理二进制文件,切掉子序列, 解包他们的内容,并写出来作为csv作为我去 我知道如何写csv。我的问题是读取文件和解包部分。这是我的非工作代码 import csv import sys import struct writer = csv.writer(sys.stdout, delimiter=',', quoting=csv.QUOTE_NONE,
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
使用ignacio的可能解决方案和答案 首先计算chunksize=struct.calcsize()
您需要计算结构的大小(提示:
struct.calcsize()
),并一次从文件中读取该大小的倍数。您不能像使用文本文件那样直接迭代输入,因为没有分隔符。您可以使用它来解压文件中的值:
#!/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))
什么不起作用?
unpack
是否返回您期望的内容?行数是多少?什么构成二进制文件的一行?@martineau这是一个错误。我想我可能需要一次读取一个固定数量的字节?是的,这就是Ignacio在他的回答中所说的,我相信…如果你愿意,你可以读取该固定数量的倍数。我是否必须使用open(“myfile”,“rb”)作为f:;bytes=f.read(numberofbytes)?比这多了几行,但是是的。你能把整个文件读入内存,并以某种方式逐块处理它吗?我想这可能会更快。你想看多少就看多少。不过我建议不要读太多;一次超过10MB对您几乎没有好处。
from functools import partial
for buf in iter(partial(file.read, record.size), b''):
writer.writerow(record.unpack_from(buf))