Как использовать pyparsing для сопоставления нескольких строк при использовании итератора для чтения файла
В определении моей грамматики Pyparsing есть некоторые грамматики, которые будут соответствовать строкам, которые занимают несколько строк. Если я использую API, как:
PyGrammar.parseString(open('file_name').read())
Если будете вести себя правильно.
Однако, если я хочу использовать итератор для чтения файла, как
with open('file_name') as f:
for line in f:
PyGrammar.parseString(line)
парсер сломается
Есть ли способ обойти это дело. Спасибо...
1 ответ
По словам Павла (автор 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)