2016-08-05 41 views
-1

Ich muss txt-Dateien mit XML-Markup in einem Verzeichnis analysieren (ich habe bereits einen Korpus mit glob erstellt), aber Etree Parse erlaubt nur eine Datei zu einem Zeitpunkt. Wie richte ich eine Schleife ein, um alle Dateien gleichzeitig zu analysieren? Das Ziel besteht dann darin, diese Dateien mithilfe von Anfragen zu Elasticsearch hinzuzufügen. Das ist, was ich habe, so weit:Vollständiges Verzeichnis analysieren Etree Parse lxml

import json 
import os 
import re 
from lxml import etree 
import xmltodict 
import glob 

corpus=glob.glob('path/*.txt') 
ns=dict(tei="http://www.tei-c.org/ns/1.0") 
tree = etree.ElementTree(file='path/file.txt') 
doc = { 
    "author": tree.xpath('//tei:author/text()', namespaces=ns)[0], 
    "title": tree.xpath('//tei:title/text()', namespaces=ns)[0], 
    "content": "".join(tree.xpath('//tei:text/text()', namespaces=ns)) 
    } 
+0

Sind Sie fragen, wie ein for-Schleife zu schreiben? –

Antwort

1

einfach iterieren auf der corpus Liste. Sie sollten jedoch einen Container wie eine Liste oder ein Wörterbuch verwenden, um die einzelnen analysierten Daten zu speichern. Im Folgenden wird davon ausgegangen TXT-Dateien .xml-Dateien wohlgeformt sind und tei Namespace mit derselben Struktur beibehalten:

import os, glob 
from lxml import etree 

corpus = glob.glob('path/*.txt') 
ns = dict(tei="http://www.tei-c.org/ns/1.0") 

xmlList = []; xmlDict = {} 

for file in corpus: 
    tree = etree.parse(file) 
    doc = { 
      "author": tree.xpath('//tei:author/text()', namespaces=ns)[0], 
      "title": tree.xpath('//tei:title/text()', namespaces=ns)[0], 
      "content": "".join(tree.xpath('//tei:text/text()', namespaces=ns)) 
      } 
    # LIST OF DOC DICTS 
    xmlList.append(doc)     

    # DICTIONARY OF DOC DICTS, KEY IS FILE NAME 
    key = os.path.basename(file).replace('.txt', '') 
    xmlDict[key] = doc