Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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
如何使用QDataStream在Python中打开bin文件_Python_Qt_Csv_Pyqt_Qdatastream - Fatal编程技术网

如何使用QDataStream在Python中打开bin文件

如何使用QDataStream在Python中打开bin文件,python,qt,csv,pyqt,qdatastream,Python,Qt,Csv,Pyqt,Qdatastream,我有一个bin文件,它编码在一个应用程序中,我需要访问并转换成csv文件。我已经收到了文档,但不确定如何使用Python访问此文件的内容 下面是有关数据集是如何序列化的一些详细信息 bin是使用QDataStream::Qt_4_7版本的QDataStream序列化的数据集类列表 datasets.bin文件的格式为: quint32幻数0x46474247 第32版第1版 quint32数据集标记0x44415441 qint32#数据集n 数据集1 数据集2 . . . . 数据集 每个数据

我有一个bin文件,它编码在一个应用程序中,我需要访问并转换成csv文件。我已经收到了文档,但不确定如何使用Python访问此文件的内容

下面是有关数据集是如何序列化的一些详细信息

bin是使用QDataStream::Qt_4_7版本的QDataStream序列化的数据集类列表

datasets.bin文件的格式为:
quint32幻数0x46474247
第32版第1版
quint32数据集标记0x44415441
qint32#数据集n
数据集1
数据集2
.
.
.
.
数据集
每个数据集的格式为:
quint32幻数0x53455455
QString名称
quint32标志位字段(设置表)
QString Id[可选]
QColor颜色[可选]
qint32装置[可选]
QStringList创建者ID[可选]
布尔隐藏[可选]
QList阈值[可选]
QString源[可选]
qint32角色[可选]
矢量数据点

我一直在查阅PyQt4数据流文档,但似乎找不到任何具体的示例。任何帮助我指向正确方向的帮助都将是伟大的< /P> < PQT不能像C++一样读取所有数据,因为它不能处理模板类(如<代码> QList< <代码>和<代码> QVector >代码>),这将需要Python中不可用的语言特定支持。这意味着必须使用变通方法。幸运的是,该方法非常简单,因此读取任意模板类可以简化为一个简单的算法:读取长度为
uint32
,然后在
范围内迭代,并将包含的元素逐个读取到
列表中:

points = []
length = stream.readUInt32()
for index in range(length):
    point = QPoint()
    stream >> point
    points.append(point)
下面是一个脚本,演示如何正确读取整个数据集格式:

from PyQt4 import QtCore, QtGui

FLAG_HASSOURCE = 0x0001
FLAG_HASROLE = 0x0002
FLAG_HASCOLOR = 0x0004
FLAG_HASID = 0x0008
FLAG_COMPRESS = 0x0010
FLAG_HASTHRESHOLDS = 0x0020
FLAG_HASUNITS = 0x0040
FLAG_HASCREATORIDS = 0x0080
FLAG_HASHIDDEN = 0x0100
FLAG_HASMETADATA = 0x0200

MAGIC_NUMBER = 0x46474247
FILE_VERSION = 1
DATASET_MARKER = 0x44415441
DATASET_MAGIC = 0x53455455

def read_data(path):
    infile = QtCore.QFile(path)
    if not infile.open(QtCore.QIODevice.ReadOnly):
        raise IOError(infile.errorString())

    stream = QtCore.QDataStream(infile)
    magic = stream.readUInt32()
    if magic != MAGIC_NUMBER:
        raise IOError('invalid magic number')
    version = stream.readUInt32()
    if version != FILE_VERSION:
        raise IOError('invalid file version')
    marker = stream.readUInt32()
    if marker != DATASET_MARKER:
        raise IOError('invalid dataset marker')
    count = stream.readInt32()
    if count < 1:
        raise IOError('invalid dataset count')

    stream.setVersion(QtCore.QDataStream.Qt_4_7)

    rows = []
    while not stream.atEnd():
        row = []

        magic = stream.readUInt32()
        if magic != DATASET_MAGIC:
            raise IOError('invalid dataset magic number')

        row.append(('Name', stream.readQString()))

        flags = stream.readUInt32()
        row.append(('Flags', flags))

        if flags & FLAG_HASID:
            row.append(('ID', stream.readQString()))
        if flags & FLAG_HASCOLOR:
            color = QtGui.QColor()
            stream >> color
            row.append(('Color', color))
        if flags & FLAG_HASUNITS:
            row.append(('Units', stream.readInt32()))
        if flags & FLAG_HASCREATORIDS:
            row.append(('Creators', stream.readQStringList()))
        if flags & FLAG_HASHIDDEN:
            row.append(('Hidden', stream.readBool()))
        if flags & FLAG_HASTHRESHOLDS:
            thresholds = []
            length = stream.readUInt32()
            for index in range(length):
                thresholds.append(stream.readDouble())
            row.append(('Thresholds', thresholds))
        if flags & FLAG_HASSOURCE:
            row.append(('Source', stream.readQString()))
        if flags & FLAG_HASROLE:
            row.append(('Role', stream.readInt32()))

        points = []
        length = stream.readUInt32()
        for index in range(length):
            point = QtCore.QPointF()
            stream >> point
            points.append(point)
        row.append(('Points', points))
        rows.append(row)

    infile.close()

    return rows

rows = read_data('datasets.bin')

for index, row in enumerate(rows):
    print('Row %s:' % index)
    for key, data in row:
        if isinstance(data, list) and len(data):
            print('  %s = [%s ... ] (%s items)' % (
                  key, repr(data[:3])[1:-1], len(data)))
        else:
            print('  %s = %s' % (key, data))
从PyQt4导入QtCore,QtGui
标志\u HASSOURCE=0x0001
标志\u HASROLE=0x0002
标志颜色=0x0004
标志\u HASID=0x0008
FLAG_COMPRESS=0x0010
标志\u HASTHRESHOLDS=0x0020
标志\u HASUNITS=0x0040
标志\u hasCreatorId=0x0080
标志\u HASHIDDEN=0x0100
标志\u HASMETADATA=0x0200
幻数=0x46474247
文件\u版本=1
数据集_标记=0x44415441
数据集\u MAGIC=0x53455455
def读取_数据(路径):
infle=QtCore.QFile(路径)
如果未填充。打开(QtCore.QIODevice.ReadOnly):
raise IOError(infle.errorString())
stream=QtCore.QDataStream(infle)
magic=stream.readUInt32()
如果有魔法!=魔术号码:
raise IOError('无效的幻数')
版本=stream.readUInt32()
如果版本!=文件版本:
raise IOError('文件版本无效')
marker=stream.readUInt32()
如果标记!=数据集\u标记:
raise IOError('无效的数据集标记')
count=stream.readInt32()
如果计数小于1:
raise IOError('无效的数据集计数')
setVersion(QtCore.QDataStream.Qt_4_7)
行=[]
而不是stream.atEnd():
行=[]
magic=stream.readUInt32()
如果有魔法!=数据集\u魔法:
raise IOError('无效的数据集幻数')
追加(('Name',stream.readQString()))
flags=stream.readUInt32()
行。追加(('Flags',Flags))
如果标志&FLAG\u HASID:
append(('ID',stream.readQString()))
如果标志和标志颜色为:
color=QtGui.QColor()
流>>颜色
行。追加(('Color',Color))
如果标志和标志有单位:
追加(('Units',stream.readInt32()))
如果flags&FLAG_有创建者ID:
append(('Creators',stream.readQStringList()))
如果标记和标记\u HASHIDDEN:
追加(('Hidden',stream.readBool()))
如果标志和标志有阈值:
阈值=[]
长度=stream.readUInt32()
对于范围内的索引(长度):
thresholds.append(stream.readDouble())
追加(('Thresholds',Thresholds))
如果标志和标志有来源:
追加(('Source',stream.readQString()))
如果标志和标志为角色:
行.append(('Role',stream.readInt32()))
点数=[]
长度=stream.readUInt32()
对于范围内的索引(长度):
point=QtCore.QPointF()
流>>点
点。追加(点)
行。追加((‘点’,点))
行。追加(行)
infle.close()
返回行
行=读取数据('datasets.bin'))
对于索引,枚举中的行(行):
打印('行%s:'%index)
对于键,行中的数据:
如果isinstance(数据、列表)和len(数据):
打印(“%s=[%s…](%s项)%)(
键,repr(数据[:3])[1:-1],len(数据)))
其他:
打印(“%s=%s%”(键,数据))

使用QDataStream是否最简单,例如与Qt Python绑定一起使用?如果有人想测试数据集文件,这里有一个指向该文件的链接out@MichaelBawol. 我尝试用C++读取那个文件,在第一个代码<源> <代码>条目中失败。因此,要么格式不完整/错误,要么文件已损坏。你从哪里得到这些文件?您是否有一个包含一组已知值的小玩具示例?每个数据集箱都存储有一个xml文件。该数据集来自我为下载和处理传感器数据而构建的自定义软件。从那以后,这家公司就给了我这种格式。这是我收到的完整的格式化文档@迈克尔鲍尔。我能够创建一个C++工具,它可以读取包含格式文件的数据集文件。但是,它无法读取另一个数据集文件,我现在确定该文件已损坏或格式不同。我已经根据我学到的知识更新了我的答案,但我仍然看不到答案
from PyQt4 import QtCore, QtGui

FLAG_HASSOURCE = 0x0001
FLAG_HASROLE = 0x0002
FLAG_HASCOLOR = 0x0004
FLAG_HASID = 0x0008
FLAG_COMPRESS = 0x0010
FLAG_HASTHRESHOLDS = 0x0020
FLAG_HASUNITS = 0x0040
FLAG_HASCREATORIDS = 0x0080
FLAG_HASHIDDEN = 0x0100
FLAG_HASMETADATA = 0x0200

MAGIC_NUMBER = 0x46474247
FILE_VERSION = 1
DATASET_MARKER = 0x44415441
DATASET_MAGIC = 0x53455455

def read_data(path):
    infile = QtCore.QFile(path)
    if not infile.open(QtCore.QIODevice.ReadOnly):
        raise IOError(infile.errorString())

    stream = QtCore.QDataStream(infile)
    magic = stream.readUInt32()
    if magic != MAGIC_NUMBER:
        raise IOError('invalid magic number')
    version = stream.readUInt32()
    if version != FILE_VERSION:
        raise IOError('invalid file version')
    marker = stream.readUInt32()
    if marker != DATASET_MARKER:
        raise IOError('invalid dataset marker')
    count = stream.readInt32()
    if count < 1:
        raise IOError('invalid dataset count')

    stream.setVersion(QtCore.QDataStream.Qt_4_7)

    rows = []
    while not stream.atEnd():
        row = []

        magic = stream.readUInt32()
        if magic != DATASET_MAGIC:
            raise IOError('invalid dataset magic number')

        row.append(('Name', stream.readQString()))

        flags = stream.readUInt32()
        row.append(('Flags', flags))

        if flags & FLAG_HASID:
            row.append(('ID', stream.readQString()))
        if flags & FLAG_HASCOLOR:
            color = QtGui.QColor()
            stream >> color
            row.append(('Color', color))
        if flags & FLAG_HASUNITS:
            row.append(('Units', stream.readInt32()))
        if flags & FLAG_HASCREATORIDS:
            row.append(('Creators', stream.readQStringList()))
        if flags & FLAG_HASHIDDEN:
            row.append(('Hidden', stream.readBool()))
        if flags & FLAG_HASTHRESHOLDS:
            thresholds = []
            length = stream.readUInt32()
            for index in range(length):
                thresholds.append(stream.readDouble())
            row.append(('Thresholds', thresholds))
        if flags & FLAG_HASSOURCE:
            row.append(('Source', stream.readQString()))
        if flags & FLAG_HASROLE:
            row.append(('Role', stream.readInt32()))

        points = []
        length = stream.readUInt32()
        for index in range(length):
            point = QtCore.QPointF()
            stream >> point
            points.append(point)
        row.append(('Points', points))
        rows.append(row)

    infile.close()

    return rows

rows = read_data('datasets.bin')

for index, row in enumerate(rows):
    print('Row %s:' % index)
    for key, data in row:
        if isinstance(data, list) and len(data):
            print('  %s = [%s ... ] (%s items)' % (
                  key, repr(data[:3])[1:-1], len(data)))
        else:
            print('  %s = %s' % (key, data))