1

我有一个具有以下格式的巨大文本文件(作为 ASCII 文件)。我正在使用 python 来处理相同的内容。对于这种文件,我有几个问题(以更通用的方式)。

  1. 如何检查数据格式的正确性?有没有办法指定一个模板,然后验证这些文本文件的正确性?(类似于 xml 的 dtd 文件)。
  2. 第二个问题是解析此类文件并从文件中读取数据。就像我希望XYZ数据出现time在行之后并且需要解析它们一样。这种情况有什么简单的机制吗?再次像模板和解析机制。
===========================BEGIN=========================================  
2012-12-05  12:03  
XYZ 123(0)  654(2)  232(4)  
MON  23(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================  
===========================BEGIN=========================================  
2012-12-05  12:04  
XYZ 123(0)  654(2)  232(4)  
MON  23(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================  
===========================BEGIN=========================================  
2012-12-05  12:05  
XYZ 523(0)  654(2)  235(4)  
MON  83(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================  
===========================BEGIN=========================================  
2012-12-05  12:03  
XYZ 193(0)  644(2)  232(4)  
MON  23(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================  
4

2 回答 2

1

您可以尝试以下变体:-

import re
s = '''===========================BEGIN=========================================  
2012-12-05  12:03  
XYZ 123(0)  654(2)  232(4)  
MON  23(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================  
===========================BEGIN=========================================  
2012-12-05  12:04  
XYZ 123(0)  654(2)  232(4)  
MON  23(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================  
===========================BEGIN=========================================  
2012-12-05  12:05  
XYZ 523(0)  654(2)  235(4)  
MON  83(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================  
===========================BEGIN=========================================  
2012-12-05  12:03  
XYZ 193(0)  644(2)  232(4)  
MON  23(0)   54(2)   32(4)  
POR  13(0)   64(1)   92(2)  
=========================== END =========================================
'''
print re.findall(r'=+BEGIN=+\s+(\d+-\d+-\d+\s+\d+:\d+)\s+(((XYZ|MON|POR).*\s+){3})', s)

这打印: -

[('2012-12-05  12:03', 'XYZ 123(0)  654(2)  232(4)  \nMON  23(0)   54(2)   32(4)  \nPOR  13(0)   64(1)   92(2)  \n'), 
 ('2012-12-05  12:04', 'XYZ 123(0)  654(2) 232(4)  \nMON  23(0)   54(2)   32(4)  \nPOR  13(0)   64(1)   92(2)  \n'), 
 ('2012-12-05  12:05', 'XYZ 523(0)  654(2)  235(4)  \nMON  83(0)   54(2)   32(4)  \nPOR  13(0)   64(1)   92(2)  \n'), 
 ('2012-12-05  12:03', 'XYZ 193(0)  644(2)  232(4)  \nMON  23(0)   54(2)   32(4)  \nPOR  13(0)   64(1)   92(2)  \n')]
于 2013-01-08T08:21:27.460 回答
0

为了解决您的第一个问题-您可以按制表符拆分文件的每一行(当然,如果它是制表符分隔的)。然后您就知道哪些元素位于列表的哪些位置。因此,您可以使用例如 dateutil.parser 来检测日期是否是正确的日期字符串。

至于你的第二个问题——如果可能的话,我会使用字典。因此,如果 XYZ 始终是一行的第一个条目,我会使用该值作为键。XYZ 线的其余部分可能是数据。使用此方法,您不必期望文件的行按任何特定顺序排列。

于 2013-01-08T07:17:29.197 回答