2016-07-05 8 views
1

Ich bin neu in Python, habe aber einige Erfahrungen mit Delphi. Ich versuche, ein Skript zu machen, das in der Lage wäre, alle XML-Dateien im Verzeichnis (einschließlich aller Unterverzeichnisse in diesem Verzeichnis) zu durchsuchen, dann diese XML zu analysieren und einige Daten (Zahlen) von dort in eine einfache TXT-Datei zu speichern. Danach arbeite ich durch diese TXT-Datei, um eine weitere TXT-Datei mit nur einem eindeutigen Zahlensatz aus der zuvor erstellten TXT-Datei zu erstellen.Parsen aller XML-Dateien im Verzeichnis und allen Unterverzeichnissen

ich dieses Skript erstellt:

import os 
from xml.dom import minidom 

#for testing purposes 
directory = os.getcwd() 

print("Procházím aktuální adresář, hledám XML soubory...") 
print("Procházím XML soubory, hledám IČP provádějícího...") 

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for root, dirs, files in os.walk(directory): 
     for file in files: 
      if (file.endswith('.xml')): 
       xmldoc = minidom.parse(file) 
       itemlist = xmldoc.getElementsByTagName('is') 
       SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

print("Vytvářím list unikátních IČP...") 

with open ('ICP_distinct.txt','w') as distinct: 
    UnikatniICP = [] 
    with open ('ICP_all.txt','r') as SeznamICP_all: 
     for line in SeznamICP_all: 
      if line not in UnikatniICP: 
       UnikatniICP.append(line) 
       distinct.write(line) 

print('Počet unikátních IČP:' + str(len(UnikatniICP))) 
input('Pro ukončení stiskni libovolnou klávesu...') 

Es ist, als nur intented arbeitet, bis ein Unterverzeichnis ist, in diesem Fall, dass ich Fehler:

FileNotFoundError: [Errno 2] No such file or directory: 'RNN38987.xml' 

, die dadurch verursacht wird, dass Datei im Unterverzeichnis, nicht in einem Verzeichnis mit Python-Skript. Ich habe versucht, es über den Pfad funktioniert absoluten Pfad der Datei mit zur Arbeit zu kommen, aber ich bin mehr Fehler bekommen, sehen Sie das Skript:

import os 
from xml.dom import minidom 
from pathlib import Path 

#for testing purposes 
directory = os.getcwd() 

print("Procházím aktuální adresář, hledám XML soubory...") 
print("Procházím XML soubory, hledám IČP provádějícího...") 

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for root, dirs, files in os.walk(directory): 
     for file in files: 
      if (file.endswith('.xml')): 
       soubor = Path(file).resolve() 
       print(soubor) 
       xmldoc = minidom.parse(soubor) 
       itemlist = xmldoc.getElementsByTagName('is') 
       SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

print("Vytvářím list unikátních IČP...") 

with open ('ICP_distinct.txt','w') as distinct: 
    UnikatniICP = [] 
    with open ('ICP_all.txt','r') as SeznamICP_all: 
     for line in SeznamICP_all: 
      if line not in UnikatniICP: 
       UnikatniICP.append(line) 
       distinct.write(line) 

print('Počet unikátních IČP:' + str(len(UnikatniICP))) 
input('Pro ukončení stiskni libovolnou klávesu...') 

Der Fehler, den ich jetzt bekomme ich nicht wirklich verstehen und Google hilft auch nicht - ganzes Protokoll:

Procházím aktuální adresář, hledám XML soubory... 
Procházím XML soubory, hledám IČP provádějícího... 
C:\2_Programming\Python\IČP FINDER\src\20150225_1815_2561_1.xml 
Traceback (most recent call last): 
    File "C:\2_Programming\Python\IČP FINDER\src\ICP Finder.py", line 17, in <module> 
    xmldoc = minidom.parse(soubor) 
    File "C:\2_Programming\Python\Interpreter\lib\xml\dom\minidom.py", line 1958, in parse 
    return expatbuilder.parse(file) 
    File "C:\2_Programming\Python\Interpreter\lib\xml\dom\expatbuilder.py", line 913, in parse 
    result = builder.parseFile(file) 
    File "C:\2_Programming\Python\Interpreter\lib\xml\dom\expatbuilder.py", line 204, in parseFile 
    buffer = file.read(16*1024) 
AttributeError: 'WindowsPath' object has no attribute 'read' 

Können Sie mir bitte helfen?

+0

Abgesehen: 'UnikatniICP = set()'/'UnikatniICP.add (Linie)' könnte schneller gehen. Wenn Ihnen die Reihenfolge egal ist, können 'distinct.writelines (set (SeznamICP_all))' am schnellsten gehen. –

Antwort

1

Das Muster die Sie suchen, ist wie:

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for root, dirs, files in os.walk(directory): 
     for file in files: 
      if (file.endswith('.xml')): 
       xmldoc = minidom.parse(os.path.join(root, file)) 
       itemlist = xmldoc.getElementsByTagName('is') 
       SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

In jeder Iteration Ihrer for Schleife, root in das Verzeichnis, in die sich die files und dirs existieren.

+0

Danke, das funktioniert sehr gut! Allerdings stieß ich auf ein Problem, als ich entdeckte, dass nicht alle XML-Dateien Tag mit Attribut icp haben. Gibt es eine Möglichkeit, die Anwesenheit dieses Tags mit Minidom zu überprüfen? –

0

Ihr Problem, wie bereits in Robs Antwort erklärt, ist, weil Sie nicht den Pfad beitreten, so dass Sie nach dem Verlassen der CWD Dateien außerhalb des Verzeichnisses finden, aber suchen sie in der CWD.

Da Sie verwenden oythin3 Sie haben ein paar andere Optionen, um die Dateien zu finden, wenn Ihre python3 Version 3.5 ist können alle xml Dateien finden glob rekursiv Suche mit:

import glob 
import os 
from xml.dom import minidom 

directory = os.getcwd() 

with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for file in glob.iglob(directory+'/**/*xml', recursive=True): 
      xmldoc = minidom.parse(file) 
      itemlist = xmldoc.getElementsByTagName('is') 
      SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n') 

Oder wenn Sie verwenden python 3.4, können Sie pathlib verwenden, um eine rekursive Suche zu tun:

from pathlib import Path 


with open ('ICP_all.txt', 'w') as SeznamICP_all: 
    for file in Path(directory).glob('**/*.xml') 
     xmldoc = minidom.parse(file) 
     itemlist = xmldoc.getElementsByTagName('is') 
     SeznamICP_all.write(itemlist[0].attributes['icp'].value + '\n')