2

pyparsing の作成者である Paul McGuire は、私が解決しようとしている問題について親切に助けてくれました。ゴールまであと 1 ヤードの 1 ダウンですが、ゴール ラインをパントすることさえできません。孔子は、生徒に解の 4 分の 1 を与え、残りの 4 分の 3 を返さなければ、その生徒には二度と教えないと言いました。それで、私がこれを尋ねるのは、ほぼ1週間の欲求不満と大きな不安の後でです...

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 番目の列を 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

理解できるまで各ピースを分解してください。ここから、この最小限の例を上記のより複雑な問題にゆっくりと適応させることができます。ポール自身が次のように述べているため、ファイルを (比較的小さい限り) 読み込むことは問題ありません。

parseFileは parseString の単純なショートカットであり、 とほとんど同じですexpr.parseString(open(filename).read())

于 2012-06-07T13:46:13.493 に答える