0

Das Erstellen eines Codes unterhalb eines Community-Mitglieds hier half mir bei der Feinabstimmung, um eine Funktion zu erstellen, die einen Wörterbuchwert aus einer Textdatei nimmt und dann durch diesen Wert nach einer Liste von Dateien sucht. Dies war der Code, in dem ich alle gefundenen Werte an dasselbe Blatt anfügte.Wie erstellt man verschiedene Dateien für jedes Mal, wenn eine Funktion für ein Element in einer for-Schleife ausgeführt wird?

import csv 
import glob 
import ast 
from os.path import isfile 
from lxml import etree 

def look_for_speaker_in_files(speakerAttrib): 
    speakerDict = ast.literal_eval(speakerAttrib) 
    l_file_exists = False 
    if isfile("allspeakers.csv"): 
     l_file_exists = True 
    c = csv.writer(open("allspeakers.csv","a")) 
    if not l_file_exists: 
     c.writerow(["Name", "Filename", "Text"]) 
    lparser = etree.XMLParser(recover=True) 
    for cr_file in glob.iglob('parsed/*.xml'): 
     try: 
      tree = etree.parse(cr_file,parser=lparser) 
      for node in tree.iter('speaking'): 
      if node.keys() == speakerDict.keys(): 
       c.writerow([node.attrib, cr_file, node.text]) 
      else: 
       continue 
     except: 
      print "bad string " + cr_file 
      raise 

def main(): 
    with open("speaking-basic.txt","r") as speaker_list: 
     for x in speaker_list: 
      print x 
      look_for_speaker_in_files(x) 
if __name__ == "__main__": 
    main() 

Jetzt suche ich eine andere Datei für jedes Element aus der Textdatei zu erstellen, und aus der Textdatei nur die Spiele für die Knoten in den Akten, das Element abzulagern.

Ich versuchte den folgenden Code, wo ich die Funktion änderte, die durch die Dateien liest, um es zu versuchen, das Argument für den Dateinamen und das Argument für das Element aus der Textdatei zu suchen. Ich änderte dann den Code, der das Element aus der Liste nimmt, um sowohl das Element aus der Liste zu lesen, als auch um einen Dateinamen zu erstellen, der dem Wert der Wörterbuchelemente in der Datei entspricht.

import csv 
import glob 
import ast 
from os.path import isfile 
from lxml import etree 

def look_for_speaker_in_files(speakerAttrib,file_name): 
    speakerDict = ast.literal_eval(speakerAttrib) 
    l_file_exists = False 
    if isfile(file_name + ".csv"): 
     l_file_exists = True 
    c = csv.writer(open(file_name + ".csv","a")) 
    print c 
    if not l_file_exists: 
     c.writerow(["Name", "Filename", "Text"]) 
    lparser = etree.XMLParser(recover=True) 
    for cr_file in glob.iglob('parsed/*.xml'): 
     try: 
      tree = etree.parse(cr_file,parser=lparser) 
      for node in tree.iter('speaking'): 
      if node.keys() == speakerDict.keys(): 
       c.writerow([node.attrib, cr_file, node.text]) 
      else: 
       continue 
     except: 
      print "bad string " + cr_file 
      raise 

def main(): 
    with open("speaking.txt","r") as speaker_list: 
     for x in speaker_list: 
      print x 
      dictx = ast.literal_eval(x) 
      valuex = str(dictx.values()).format() 
      print valuex 
      look_for_speaker_in_files(x,valuex) 
if __name__ == "__main__": 
    main() 

Ich habe auch versucht die Suche durch die Dateien-Funktion auf das gleiche Argument zu halten, aber eine Variable hinzufügen, die von diesem Argument mit dem Dateinamen kam, aber das hat nicht funktioniert auch.

import csv 
import glob 
import ast 
from os.path import isfile 
from lxml import etree 

def look_for_speaker_in_files(speakerAttrib): 
    speakerDict = ast.literal_eval(speakerAttrib) 
    file_name = str(speakerDict.values()).format() 
    l_file_exists = False 
    if isfile(file_name + ".csv"): 
     l_file_exists = True 
    c = csv.writer(open(file_name + ".csv","a")) 
    if not l_file_exists: 
     c.writerow(["Name", "Filename", "Text"]) 
    lparser = etree.XMLParser(recover=True) 
    for cr_file in glob.iglob('parsed/*.xml'): 
     try: 
      tree = etree.parse(cr_file,parser=lparser) 
      for node in tree.iter('speaking'): 
      if node.keys() == speakerDict.keys(): 
       c.writerow([node.attrib, cr_file, node.text]) 
      else: 
       continue 
     except: 
      print "bad string " + cr_file 
      raise 

def main(): 
    with open("speaking-basic.txt","r") as speaker_list: 
     for x in speaker_list: 
      print x 
      look_for_speaker_in_files(x) 
if __name__ == "__main__": 
    main() 

Während diese Codes, um die Dateien, mit all meinem futzing mit ihm schaffen scheine ich nur in der Lage sein, es zu bekommen entweder nichts in den Akten zu legen, aber die Spaltenüberschriften oder die Lautsprecher alle aus den XML-Dateien setzen in jedem einzelnen, nicht nur dem, den ich in die Funktion gesteckt habe. Außerdem kann ich den Dateinamen nicht ohne die [''] erstellen.

Ich habe die XML-Dateien die Funktion mit den Werten durch und die Textdatei sucht ich hier auf der Google-Verbindung stehe auf: https://drive.google.com/open?id=0B7lGA34vOZItREhRbmF6Z3YtTnM

Jede Hilfe auf diesem würde Super klar sein, danke!

Antwort

1

Ich bin mir nicht sicher, ob ich Ihre Anforderung richtig verstanden habe. Nun, was dieser Code macht, finden Sie in Bezug auf das Attribut, das in der reading-basic.txt angegeben ist, die Attribute in den geparsten XMLs. Wenn der Attributname und seine Werte in der Datei "speaking-basic.txt" und in den XML-Dateien übereinstimmen, geben Sie sie in eine Datei mit dem Namen des Sprechers aus.

Überprüfen Sie, ob Sie das suchen, vielleicht habe ich es nicht richtig verstanden. Wenn ja, bitte geben Sie ein klares Verständnis der erwarteten Ausgabe mit Screenshots oder Beispielen.

import csv 
import glob 
import ast 
from os.path import isfile 
from lxml import etree 

def look_for_speaker_in_files(speakerAttrib): 
    speakerDict = ast.literal_eval(speakerAttrib) 
    file_name = str(speakerDict.values()[0]).format() 
    l_file_exists = False 
    if isfile(file_name + ".csv"): 
     l_file_exists = True 
    c = csv.writer(open(file_name + ".csv","a")) 
    if not l_file_exists: 
     c.writerow(["Name", "Filename", "Text"]) 
    lparser = etree.XMLParser(recover=True) 
    for cr_file in glob.iglob('parsed/*.xml'): 
     try: 
      tree = etree.parse(cr_file,parser=lparser) 
      for node in tree.iter('speaking'): 
      if node.keys() == speakerDict.keys(): 
       if node.values() == speakerDict.values(): 
        c.writerow([node.attrib, cr_file, node.text]) 
       else: 
        continue 
      else: 
       continue 
     except: 
      print "bad string " + cr_file 
      raise 

def main(): 
    with open("speaking-basic.txt","r") as speaker_list: 
     for x in speaker_list: 
      print x 
      look_for_speaker_in_files(x) 
if __name__ == "__main__": 
    main() 
+0

ah, das sieht aus wie es behebt, danke –

+0

Cool. Außerdem würde ich bitten, meine Antwort auf die andere Frage als die richtige zu wählen, da Sie, da Sie sie losgerissen haben, mir 15 Punkte gegeben haben. Ich hoffe du hast es verstanden :-). – pmaniyan

Verwandte Themen