pyparsing:迭代文件并停止匹配

pyparsing: iterate file and stop on match

我正在打开一个文件来解析内容。我知道内容位于一个相当大的文件的开头。

目前,我 open/read 整个文件并让 pyparse 完成它。这行得通,但由于读取文件的时间,它花费的时间比需要的时间长。因此,作为解决方法,我将文件 read() 限制为 10kB,这样速度更快:

with open(p, errors="ignore",newline='') as f:
    try:
        x = final.search_string(f.read(10*1024), 1) # Only first match
    except ParseException as pe:
        print(pe)

但是,我无法确定我要查找的内容是否在前 10kB 内。那么,有没有办法让 pyparse 逐行读取文件,然后在匹配时停止?

注意:我尝试匹配的内容跨越多行,因此我不会只在一行上获得完整的语法匹配。例如:

info
{
    a: foo
    b: bar
}

我不知道有什么方法可以让 pyparsing 在匹配时停止。如果做不到这一点,我将简单地分块输入:

CHUNKLINES = 20
BACKUP = 4 # length of expected region - 1


with open(p, errors="ignore", newline='') as f:
    match = False
    lines = []
    while not match:
        lines += [f.readline() for _ in range(CHUNKLINES)]
        try:
            match = final.search_string("".join(lines), 1)
        except ParseException as pe:
            print(pe)
        lines = lines[-BACKUP:]


if match:
    ...

我选择使用行而不是字节,因为它使逻辑更容易。基本思想是我们可能遇到的最大错误是捕获除所需区域的最后一行之外的所有内容,因此我们保留那么多行以供下一次尝试。