Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取简单的二进制文件_Python - Fatal编程技术网

Python 如何读取简单的二进制文件

Python 如何读取简单的二进制文件,python,Python,我有一个二进制文件,它由固定长度和相等长度的连续二进制子序列组成。每个子序列可以解压成相同数量的值。我知道每个子序列的长度和值的二进制格式 如何处理二进制文件,切掉子序列, 解包他们的内容,并写出来作为csv作为我去 我知道如何写csv。我的问题是读取文件和解包部分。这是我的非工作代码 import csv import sys import struct writer = csv.writer(sys.stdout, delimiter=',', quoting=csv.QUOTE_NONE,

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

如何处理二进制文件,切掉子序列, 解包他们的内容,并写出来作为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

使用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))