Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    8

    [PYTHON] Parsare una directory di file XML

    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
    codice:
    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.

    codice:
    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,ProNipoteCedentePrestatore.text)
                        PrimoFor.append(ProNipoteCedentePrestatore.text)
    for DatiGeneraliDocumento in root.iter('DatiGeneraliDocumento'):
        for FiglioDatiGeneraliDocumento in DatiGeneraliDocumento:
            if(FiglioDatiGeneraliDocumento.tag!='Divisa'):
                print(FiglioDatiGeneraliDocumento.tag,FiglioDatiGeneraliDocumento.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,TagNipoteDatiPagamento.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

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,164
    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

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    8
    Si clasku è quello che ho detto anch'io che dovevo inserire un ciclo
    codice:
    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
    codice:
    '''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,ProNipoteCedentePrestatore.text)
                            PrimoFor.append(ProNipoteCedentePrestatore.text)
        for DatiGeneraliDocumento in root.iter('DatiGeneraliDocumento'):
            for FiglioDatiGeneraliDocumento in DatiGeneraliDocumento:
                if(FiglioDatiGeneraliDocumento.tag!='Divisa'):
                    print(FiglioDatiGeneraliDocumento.tag,FiglioDatiGeneraliDocumento.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,TagNipoteDatiPagamento.text)
                        PrimoFor.append(TagNipoteDatiPagamento.text)
    
    
        
        csv_writer.writerow(PrimoFor)  '''scrive sul file csv'''
    
    
    #closecsv 
    csvfile.close()

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.