2

pyparsing 的作者 Paul McGuire 对我正在尝试解决的问题提供了很多帮助。我们落后一码,距离球门一码,但我什至无法将球踢过球门线。孔子说,如果他给了一个学生1/4的答案,而他没有带着另外的3/4回来,那么他就不会再教那个学生了。因此,在经历了将近一周的挫败感和极大的焦虑之后,我才提出这个问题……

如何打开输入文件进行 pyparsing 并将输出打印到另一个文件?

这是我到目前为止所得到的,但这实际上是他的全部工作

from pyparsing import *
datafile = open( 'test.txt' )
# Backaus Nuer Form
num = Word(nums)
accessionDate = Combine(num + "/" + num + "/" + num)("accDate")
accessionNumber = Combine("S" + num + "-" + num)("accNum")
patMedicalRecordNum = Combine(num + "/" + num + "-" + num + "-" + num)("patientNum")
gleason = Group("GLEASON" + Optional("SCORE:") + num("left") + "+" + num("right") + "=" + num("total"))

patientData = Group(accessionDate + accessionNumber + patMedicalRecordNum)

partMatch = patientData("patientData") | gleason("gleason")

lastPatientData = None

# PARSE ACTIONS

def patientRecord( datafile ):
    for match in partMatch.searchString(datafile):
        if match.patientData:
            lastPatientData = match
        elif match.gleason:
            if lastPatientData is None:
                print "bad!"
                continue
            print "{0.accDate}: {0.accNum} {0.patientNum} Gleason({1.left}+{1.right}={1.total})".format(
                            lastPatientData.patientData, match.gleason
                            )

patientData.setParseAction(lastPatientData)

# MAIN PROGRAM

if __name__=="__main__":
    patientRecord()
4

2 回答 2

3

看起来您需要调用datafile.read()才能读取文件的内容。现在您正试图在文件对象本身上调用 searchString,而不是文件中的文本。你真的应该看看 Python 教程(特别是本节),以了解如何读取文件等。

于 2012-06-07T06:06:50.443 回答
2

看来您需要一些帮助才能将它们组合在一起。@BrenBarn 的建议很中肯,在将所有问题放在一起之前先解决简单复杂的问题。我可以通过使用更简单的语法为您提供一个关于您正在尝试做的事情的最小示例来提供帮助。您可以将其用作模板来学习如何在 python 中读取/写入文件。考虑输入文本文件data.txt

cat 3
dog 5
foo 7

让我们解析这个文件并输出结果。为了好玩,让我们将第二列乘以 2:

from pyparsing import *

# Read the input data
filename = "data.txt"
FIN      = open(filename)
TEXT     = FIN.read()

# Define a simple grammar for the text, multiply the first col by 2
digits = Word(nums)
digits.setParseAction(lambda x:int(x[0]) * 2)

blocks   = Group(Word(alphas) + digits)
grammar  = OneOrMore(blocks)

# Parse the results
result = grammar.parseString( TEXT )
# This gives a list of lists
# [['cat', 6], ['dog', 10], ['foo', 14]]

# Open up a new file for the output
filename2 = "data2.txt"
FOUT = open(filename2,'w')

# Walk through the results and write to the file
for item in result:
    print item
    FOUT.write("%s %i\n" % (item[0],item[1]))
FOUT.close()

这给出了data2.txt

cat 6
dog 10
foo 14

分解每一部分,直到你理解为止。从这里开始,您可以慢慢地将这个最小示例调整到上面更复杂的问题。可以读取文件(只要它相对较小),因为Paul 自己指出

parseFile实际上只是 parseString 的一个简单快捷方式,几乎相当于expr.parseString(open(filename).read()).

于 2012-06-07T13:46:13.493 回答