我对Python完全不熟悉。我必须解析一个包含网络字节顺序二进制编码数字的.txt文件(有关数据的详细信息,请参阅here)。我知道我必须在Python中使用包struct.unpack
。我的问题如下:
(1)由于我不太了解函数struct.unpack
的工作原理,是否可以直接解析数据?通过这个,我的意思是,如果你看data structure,似乎我必须为每种类型的消息编写代码。但是,如果我在网上查看struct.unpack
上的文档,它似乎更直接,但我不知道如何编写代码。一个简短的样本将不胜感激。
(2)解析数据后,最佳做法是什么?我想保存解析的文件,以避免每次我需要进行查询时解析文件。我应该以什么格式保存最有效的解析文件?
答案 0 :(得分:1)
这应该相对简单。我无法评论你实际上应该如何获取字节编码的信息包,但我可以帮你解析它们。
首先,这里是我将从文档第4部分收集的一些数据包类型的列表:
这继续。但作为一个例子,让我们看看如何解码其中的一个或两个:
System Event Message
数据包有3个部分,长度为6个字节:
S
(单个字符)Event Code
,从字节5开始,长度为1个字节,是一个字符串(Alpha)。在struct.unpack code table中查找每个类型,我们需要构建一个字符串来表示此序列。首先,我们有一个Character
,然后是4Byte Unsigned Integer
,然后是另一个Character
。这对应于"cIc"
的编码和解码字符串。
*注意:整数的未签名部分记录在其文档的Section 3: Data Types
构建虚假数据包
这可能会做得更好,但它有效:
>>> from datetime import datetime
>>> import time
>>> data = struct.pack('cIc', 'S', int(time.mktime(datetime.now().timetuple())), 'O')
>>> print repr(data) # What does the bytestring look like?
'S\x00\x00\x00\xa6n\x8dRO' # Yep, that's bytes alright!
打开数据包
在这个例子中,我们将使用上面的假包,但在现实世界中我们使用真实的数据响应:
>>> response_tuple = struct.unpack('cIc', data)
>>> print(repr(response_tuple))
('S', 1385000614, 'O')
在这种情况下,元组中的第3项('O'
)是一个键,在另一个名为System Event Codes - Daily
和System Event Codes - As Needed
的表中查找。
如果您需要其他示例,请随时提出,但这就是它的主旨。
有关如何存储此数据的建议。好吧,我想这取决于你想长期对这些数据做什么。可能这里的数据库很有意义。但是,如果没有进一步的信息,我不能说。
希望有所帮助!