python&;PYNEB:如何打开文件
《pyparsing》的作者保罗·麦奎尔(Paul McGuire)是。我们距离球门还有一码就落后了,但我甚至不能把球踢过球门线。孔子说,如果他给了一个学生1/4的答案,而他没有带着其他3/4回来,那么他就不会再教那个学生了。因此,在经历了将近一周的挫折之后,我怀着极大的焦虑问这个问题 如何打开一个输入文件进行pyparsing并将输出打印到另一个文件 这是我到目前为止得到的,但实际上是他的全部工作python&;PYNEB:如何打开文件,python,pyparsing,Python,Pyparsing,《pyparsing》的作者保罗·麦奎尔(Paul McGuire)是。我们距离球门还有一码就落后了,但我甚至不能把球踢过球门线。孔子说,如果他给了一个学生1/4的答案,而他没有带着其他3/4回来,那么他就不会再教那个学生了。因此,在经历了将近一周的挫折之后,我怀着极大的焦虑问这个问题 如何打开一个输入文件进行pyparsing并将输出打印到另一个文件 这是我到目前为止得到的,但实际上是他的全部工作 from pyparsing import * datafile = open( 'test.t
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()
看起来需要调用
datafile.read()
才能读取文件的内容。现在,您正在尝试调用文件对象本身的searchString,而不是文件中的文本。你真的应该看看Python教程(特别是)来了解如何读取文件等等。看起来你需要一些帮助来完成它。@BrenBarn的建议很贴切,在你把所有问题放在一起之前,先解决简单复杂的问题。我可以用一个简单得多的语法给你举一个简单的例子来说明你想做什么。您可以将其用作模板来创建。考虑输入文本文件<代码> DAT.TXT:
cat 3
dog 5
foo 7
cat 6
dog 10
foo 14
让我们分析这个文件并输出结果。为了获得一些乐趣,让我们将第二列乘以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 3
dog 5
foo 7
cat 6
dog 10
foo 14
把每一块都分解,直到你理解为止。从这里开始,您可以慢慢地使这个最小的示例适应上面更复杂的问题。可以在中读取文件(只要文件相对较小),因为:
parseFile
实际上只是围绕parseString的一个简单快捷方式,非常简单
相当于expr.parseString(open(filename).read())
谢谢,是的,信不信由你,我实际上已经在一个标签上打开了。现在我在patientRecord中找到了文件“MyParser.py”,第32行,用于partMatch.searchString(datafile.read())中的匹配:AttributeError:“str”对象没有属性“read”,这可能更好,我真的不知道。谢谢,我认为这可能是一个简单的思路:你应该尝试创建一个简单得多的程序,只需读入一个文件并打印出来。然后创建一个程序,读入一个简单的文件并在其上运行一个简单的pyparsing语法。逐渐增加程序的复杂性,直到它能够处理您的实际任务。如果您是Python新手,尝试从编写一个程序来完成您希望它完成的任务开始是不明智的。人们实际上想要一个程序做的大多数事情都是复杂的。您需要从简单开始。@Niels,Wikispaces链接已关闭:-(非常感谢!经过一段时间的睡眠,这个策略终于在今天早上上班的路上进入了我的脑海。我的文件将是“1”,然后我会打开它,添加一个,并将其保存为输出。感谢您确认该策略,并展示了中间步骤。