在我的 Pyparsing 语法的定义中,有一些语法会匹配跨越多行的字符串。如果我像这样使用api:
PyGrammar.parseString(open('file_name').read())
如果将以正确的方式运行。
但是,如果我想使用迭代器来读取文件,例如
with open('file_name') as f:
for line in f:
PyGrammar.parseString(line)
解析器将中断
有没有办法解决这种情况。谢谢...
在我的 Pyparsing 语法的定义中,有一些语法会匹配跨越多行的字符串。如果我像这样使用api:
PyGrammar.parseString(open('file_name').read())
如果将以正确的方式运行。
但是,如果我想使用迭代器来读取文件,例如
with open('file_name') as f:
for line in f:
PyGrammar.parseString(line)
解析器将中断
有没有办法解决这种情况。谢谢...
根据 Paul(pyparsing 的作者)
with open('file_name') as f:
for line in f:
PyGrammar.parseString(line)
上面的代码不是使用 pyparsing 的正确方法。Pyparsing 需要在解析文本之前查看所有源文本。所以当我用每一行文本调用 parseString 时,它不起作用。另一种解决方法是为其使用包装器。喜欢:
# set up a generator to yield a line of text at a time
linegenerator = open('big_hairy_file.txt')
# buffer will accumulate lines until a fully parseable piece is found
buffer = ""
for line in linegenerator:
buffer += line
match = next(grammar.scanString(buffer), None)
while match:
tokens, start, end = match
print tokens.asList()
buffer = buffer[end:]
match = next(grammar.scanString(buffer), None)