在python中解析文件以找到第一个字符串,然后解析以下字符串,直到找到另一个字符串

时间:2015-08-03 09:09:06

标签: python parsing

我正在尝试滚动我们的某个进程打印的结果文件。

目标是查看各种块并找到特定参数。我试图解决这个问题,但无法找到一种避免多次解析文件的有效方法。

这是我读过的输出文件的一个例子:

ID:13123
Compound:xyz
... various parameters
RhPhase:abc

ID:543
Compound:lbm
... various parameters

ID:232355
Compound:dfs
... various parameters
RhPhase:cvb

我正在寻找一个具有RhPhase的特定ID,但由于该文件包含更多条目,我只想要该特定ID。它可能有也可能没有RhPhase;如果它有一个,我得到的价值。

我想出的唯一方法是实际浏览整个文件(可能是数百个块,以便了解大小),并为每个具有RhPhase的ID创建一个列表,然后在第二个例如,我滚动字典,检索特定ID的值。

这感觉效率低下;我试着做一些与众不同的事情,但是当你滚动它们的时候,我会坚持你如何标记线条;所以我可以告诉python读取每一行 - >当找到我想继续读取的ID时 - >如果你发现RhPhase得到了值,否则停在下一个ID。

我被困在这里:

datafile=open("datafile.txt", "r")
for items in datafile.readline():
    if "ID:543" in items:
        [read more lines]
        [if "RhPhase" in lines:]
        [    rhphase=lines     ]
        [elif ""ID:" in lines  ]
        [    rhphase=None      ]
        [    break             ]

找到ID后;我不知道如何继续寻找RhPhase字符串或找到第一个ID:string并停止所有内容(因为这意味着该ID没有关联的RhPhase)。

这将通过文件一次,只检查特定的ID,而不是解析整个事件,然后再进行第二次传递。 有可能这样做还是我坚持双重解析?

1 个答案:

答案 0 :(得分:1)

通常,您可以使用简单的状态机解决这些问题:在找到您的ID之前阅读这些行;然后你将你的阅读器置于一个特殊状态,然后检查你想要提取的参数。在您的情况下,您只有两种状态:找不到ID,找到ID,所以一个简单的布尔就足够了:

foundId = False
with open('datafile.txt', 'r') as datafile:
    for line in datafile:
        if foundId:
            if line.startswith('RhPhase'):
                print('Found RhPhase for ID 543:')
                print(line)

                # end reading the file
                break
            elif line.startswith('ID:'):
                print('Error: Found another ID without finding RhPhase first')
                break

        # if we haven’t found the ID yet, keep looking for it
        elif line.startswith('ID:543'):
                foundId = True