2012-06-07 5 views
1

Paul McGuire, l'auteur de pyparsing, était kind enough to help a lot with a problem I'm trying to solve. Nous sommes au 1er but avec une verge pour marquer, mais je ne peux même pas le doubler à travers la ligne de but. Confucius a dit que s'il donnait à un étudiant 1/4 de la solution, et qu'il ne revenait pas avec les autres 3/4, alors il n'enseignerait plus à cet étudiant. Donc, c'est après presque une semaine de frustration et avec beaucoup d'anxiété que je demande cela ...python & pyparsing newb: comment ouvrir un fichier

Comment puis-je ouvrir un fichier d'entrée pour pyparsing et imprimer la sortie dans un autre fichier?

Voici ce que j'ai jusqu'à présent, mais il est vraiment tout son travail

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() 
+1

http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files – monkut

Répondre

2

Il semble que vous ayez besoin d'aide pour le mettre ensemble. Le conseil de @BrenBarn est sur place, travaillez avec le problème de la complexité simple avant de tout mettre ensemble. Je peux vous aider en vous donnant un exemple minimal de ce que vous essayez de faire, avec une grammaire beaucoup plus simple. Vous pouvez l'utiliser comme modèle pour learn how to read/write a file in python. Considérez le fichier texte d'entrée data.txt:

cat 3 
dog 5 
foo 7 

Nous allons analyser ce fichier et d'afficher les résultats. Pour avoir du plaisir, nous allons mulpitply la deuxième colonne de 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() 

Cela donne à data2.txt:

cat 6 
dog 10 
foo 14 

Pause chaque morceau jusqu'à ce que vous le comprenez. De là, vous pouvez adapter lentement cet exemple minimal à votre problème plus complexe ci-dessus. Il est OK pour lire le fichier (tant qu'il est relativement faible) depuis Paul himself notes:

parseFile is really just a simple shortcut around parseString, pretty much the equivalent of expr.parseString(open(filename).read()) .

+0

merci * tellement * beaucoup! Avec un peu de sommeil, cette stratégie s'est finalement creusée dans ma tête ce matin sur le chemin du travail. Mon fichier allait être "1" alors je l'ouvrais, en rajoutais un, et le sauvegardais en sortie. Merci de confirmer cette stratégie et de montrer une étape intermédiaire. – Niels

3

Il semble que vous devez appeler datafile.read() afin de lire le contenu du fichier. En ce moment, vous essayez d'appeler searchString sur l'objet fichier lui-même, pas le texte dans le fichier. Vous devriez vraiment regarder le tutoriel Python (en particulier this section) pour obtenir de la vitesse sur la façon de lire les fichiers, etc

+0

merci Ouais, croyez-le ou non, je l'ai déjà ouvert dans un onglet. Maintenant, j'ai le fichier "MyParser.py", ligne 32, dans patientRecord pour match dans partMatch.searchString (datafile.read()): AttributeError: l'objet 'str' n'a pas d'attribut 'read', ce qui est probablement mieux Je ne sais pas vraiment. Merci bien – Niels

+0

Je pense que cela pourrait être le long des lignes: http://pyparsing.wikispaces.com/message/view/home/53509072 – Niels

+4

Vous devriez essayer de créer un programme beaucoup plus simple qui lit juste dans un fichier et l'imprime. Ensuite, créez un programme qui lit dans un fichier simple et exécute une grammaire pyparsing simple sur elle. Augmentez progressivement la complexité de votre programme jusqu'à ce qu'il soit capable de gérer votre tâche actuelle. Si vous êtes nouveau sur Python, essayer de commencer en écrivant un programme pour faire ce que vous voulez qu'il fasse est imprudent. La plupart des choses que les gens veulent réellement faire un programme sont complexes. Vous devez commencer simple. – BrenBarn

Questions connexes