PDA

Visualizza la versione completa : [PYTHON] Parsare una directory di file XML


Dumitru
19-03-2019, 12:06
Ciao ragazzi, sto cercando di parsare pi� file xml di una directory e inserire i dati in un csv quando si tratta solo di un file ci riesco perch� inserisco direttamente il nome nel comando
ET.parse('file.xml') pero quando si tratta di una directory riesco a prendere il primo file e basta.
Allego il codice magari sapete a darmi qualche indizio.


import csv import xml.etree.ElementTree as ET
import os




path = r"C:\\Users\ADMIN\Desktop\prog\."


for filename in os.listdir(path):
if not filename.endswith('.xml'):continue
fullname=os.path.join(path,filename)
print(fullname)
tree= ET.parse(fullname)




root = tree.getroot()


csvfile=open('prova.csv','w')
csv_writer = csv.writer(csvfile)




PrimoFor=[]








print("Dati Riepilogo per aliquota IVA e natura")
for datir in root.iter('DatiRiepilogo'):
for element in datir:
print(element.tag,element.text)
PrimoFor.append(element.text)

for CedentePrestatore in root.iter('CedentePrestatore'):
for TagFiglioCedentePrestatore in CedentePrestatore:
for TagNipoteCedentePrestatore in TagFiglioCedentePrestatore:
for ProNipoteCedentePrestatore in TagNipoteCedentePrestatore:
print(ProNipoteCedentePrestatore.tag,ProNipoteCede ntePrestatore.text)
PrimoFor.append(ProNipoteCedentePrestatore.text)
for DatiGeneraliDocumento in root.iter('DatiGeneraliDocumento'):
for FiglioDatiGeneraliDocumento in DatiGeneraliDocumento:
if(FiglioDatiGeneraliDocumento.tag!='Divisa'):
print(FiglioDatiGeneraliDocumento.tag,FiglioDatiGe neraliDocumento.text)
PrimoFor.append(FiglioDatiGeneraliDocumento.text)
for DatiPagamento in root.iter('DatiPagamento'):
for TagFiglioDatiPagamento in DatiPagamento:
for TagNipoteDatiPagamento in TagFiglioDatiPagamento:
if(TagNipoteDatiPagamento.tag=='ModalitaPagamento' ):
print(TagNipoteDatiPagamento.tag,TagNipoteDatiPaga mento.text)
PrimoFor.append(TagNipoteDatiPagamento.text)



csv_writer.writerow(PrimoFor)


#closecsv
csvfile.close()

Magari devo mettere qualche ciclo in pi� per ciclare tutto ma non so dove inserirlo.
Grazie

clasku
19-03-2019, 23:45
Inventa il codice in modo che la parte di recupero dati dal xml sia dentro il for in cui cicloni file nella cartella

e rendi dinamico il nome del csv di output, altrimenti lo sovrascrivi ad ogni cambio di file sorgente

Dumitru
21-03-2019, 09:57
Si clasku quello che ho detto anch'io che dovevo inserire un ciclo
for da qualche parte ma non sapevo dove. Mi aspettavo qualcosa di pi specifico nella risposta. Per quanto riguarda il nome del CSV non devo renderlo dinamico mi serve che tutti i file della directory finiscano in un CSV altrimenti per ogni XML creo un CSV. Comunque ho risolto pubblico il codice magari servir nel futuro a qualcuno

'''Created on 18 mar 2019


@author: DIMA
'''
import csv
import xml.etree.ElementTree as ET
import os


"""
specifico la cartella dove risiedono i file XML
R davanti alla strinfa sta ad indicare che la stringa in modalit RAW
Se vuoi ottenere lo stesso risultato senza la r devi fare lescaping del \
quindi C:\\Users\\ADMIN\\Desktop
"""

path = r"C:\\Users\ADMIN\Desktop\prog"


'''creo un array che utilizzero per salvare i nomi dei file nella directory'''
filenames = []


'''Ciclo for che salva nella variabile filename i nomi dei file XML
la variabile fullname associa il percorso ai file
e infine filenames che il nosto array li metto in fila i percorsi insieme ai file che deve andare a prendere
'''
for filename in os.listdir(path):
if not filename.endswith('.xml'):
continue
fullname = os.path.join(path,filename)
print(fullname)
filenames.append(fullname)




csvfile = open('prova.csv','w',newline='') '''Apro un file CSV in modalit write newline---senza questo comando i dati sul CSV vengono messi solo su righe dispari'''
csv_writer = csv.writer(csvfile) '''Restituisce un oggetto writer responsabile della conversione dei dati dell'utente in stringhe delimitate sull'oggetto file specificato'''


'''Il ciclo FOR pi importante ti prende ogni file XML ed estrae(parsa) i dati '''
for filename in filenames:
tree = ET.parse(filename)
root = tree.getroot()


PrimoFor=[] '''Array dove vengono appesi tutti i dati estratti di un file'''




'''Per estrarre dati diversi basta cambiare l'entita PADRE nei vari cicli for'''
print("Dati Riepilogo per aliquota IVA e natura")
for datir in root.iter('DatiRiepilogo'):
for element in datir:
print(element.tag,element.text)
PrimoFor.append(element.text)


for CedentePrestatore in root.iter('CedentePrestatore'):
for TagFiglioCedentePrestatore in CedentePrestatore:
for TagNipoteCedentePrestatore in TagFiglioCedentePrestatore:
for ProNipoteCedentePrestatore in TagNipoteCedentePrestatore:
print(ProNipoteCedentePrestatore.tag,ProNipoteCede ntePrestatore.text)
PrimoFor.append(ProNipoteCedentePrestatore.text)
for DatiGeneraliDocumento in root.iter('DatiGeneraliDocumento'):
for FiglioDatiGeneraliDocumento in DatiGeneraliDocumento:
if(FiglioDatiGeneraliDocumento.tag!='Divisa'):
print(FiglioDatiGeneraliDocumento.tag,FiglioDatiGe neraliDocumento.text)
PrimoFor.append(FiglioDatiGeneraliDocumento.text)
for DatiPagamento in root.iter('DatiPagamento'):
for TagFiglioDatiPagamento in DatiPagamento:
for TagNipoteDatiPagamento in TagFiglioDatiPagamento:
if(TagNipoteDatiPagamento.tag=='ModalitaPagamento' ):
print(TagNipoteDatiPagamento.tag,TagNipoteDatiPaga mento.text)
PrimoFor.append(TagNipoteDatiPagamento.text)



csv_writer.writerow(PrimoFor) '''scrive sul file csv'''


#closecsv
csvfile.close()

Loading