首页 > 解决方案 > pyparsing:迭代文件并在匹配时停止

问题描述

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

目前,我打开/读取整个文件并让 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
}

标签: pythonpyparsing

解决方案


我不知道有什么方法可以让 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:
    ...

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


推荐阅读