我有一个包含以下格式的大文本文件(作为ASCII文件)。我正在使用python进行相同的处理。对于这种文件,我几乎没有问题(以更通用的方式)。
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 =========================================
答案 0 :(得分: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')]
答案 1 :(得分:0)
要解决您的第一个问题 - 您可以通过制表符分割文件的每一行(如果它当然是制表符分隔)。然后,您可以知道哪些元素位于列表的哪个位置。 因此,您可以使用例如dateutil.parser来检测日期是否是正确的日期字符串。
至于你的第二个问题 - 我会尽可能使用字典。因此,如果XYZ始终是一行的第一个条目,我会使用该值作为键。然后,XYZ线的其余部分可以是数据。 使用此方法,您不必期望文件的行以任何特定顺序。