Vai al contenuto
StudioFatture

Organizzare studio e CAF

Come smisto automaticamente le fatture XML in cartelle per cliente e anno (script Python)?

Aggiornato il · Redazione StudioFatture

Leggi dall'XML il cessionario (IdFiscaleIVA o CodiceFiscale e Denominazione), il cedente e i campi Data e Numero di DatiGeneraliDocumento, poi copia il file in <cliente>/<anno>/<data>_<fornitore>_<numero>.xml. Lo script Python qui sotto lo fa con la sola libreria standard (ElementTree), ignorando i prefissi di namespace e i file metadati SdI. Senza script, il piano Studio di StudioFatture offre cartelle per cliente e rinomina per fornitore e data.

Campi FatturaPA usati dallo script
DatoPercorso XMLUso
ClienteFatturaElettronicaHeader/CessionarioCommittente/DatiAnagraficiCartella di primo livello
FornitoreFatturaElettronicaHeader/CedentePrestatore/DatiAnagraficiNome file
DataFatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/DataAnno e prefisso del nome
Numero…/DatiGeneraliDocumento/NumeroNome file

Lo script

Salvalo come archivio_clienti.py ed eseguilo con Python 3. I file vengono copiati, non spostati: gli originali restano dove sono.

#!/usr/bin/env python3
"""Smista fatture FatturaPA (.xml non firmati) in cartelle per cliente e anno.
Uso: python3 archivio_clienti.py <cartella_origine> <cartella_destinazione>
I file .xml.p7m vanno prima estratti; l'originale non viene modificato (copia)."""
import re, shutil, sys
from pathlib import Path
import xml.etree.ElementTree as ET

def local(tag):  # ignora i prefissi di namespace (p:, ns2:, ...)
    return tag.rsplit("}", 1)[-1]

def find(el, *path):
    for name in path:
        el = next((c for c in el if local(c.tag) == name), None) if el is not None else None
    return el

def text(el, *path):
    e = find(el, *path)
    return (e.text or "").strip() if e is not None else ""

def slug(s):
    return re.sub(r"[^A-Za-z0-9]+", "-", s).strip("-").lower()[:40] or "senza-nome"

def nome(anag):
    return text(anag, "Anagrafica", "Denominazione") or " ".join(
        x for x in (text(anag, "Anagrafica", "Nome"), text(anag, "Anagrafica", "Cognome")) if x)

src, dst = Path(sys.argv[1]), Path(sys.argv[2])
for f in sorted(src.glob("*.xml")):
    if re.search(r"_(MT|RC|NS|MC)_\d+", f.name):
        continue  # metadati e ricevute SdI
    try:
        root = ET.parse(f).getroot()
    except ET.ParseError:
        print("Non leggibile:", f.name); continue
    head = find(root, "FatturaElettronicaHeader")
    body = find(root, "FatturaElettronicaBody")
    ced = find(head, "CedentePrestatore", "DatiAnagrafici")
    ces = find(head, "CessionarioCommittente", "DatiAnagrafici")
    idc = text(ces, "IdFiscaleIVA", "IdCodice") or text(ces, "CodiceFiscale")
    doc = find(body, "DatiGenerali", "DatiGeneraliDocumento")
    data, numero = text(doc, "Data"), text(doc, "Numero")
    cartella = dst / f"{slug(nome(ces))}_{idc}" / (data[:4] or "senza-data")
    cartella.mkdir(parents=True, exist_ok=True)
    nuovo = cartella / f"{data}_{slug(nome(ced))}_{slug(numero)}.xml"
    i = 1
    while nuovo.exists():
        nuovo = nuovo.with_name(f"{nuovo.stem}_{i}.xml"); i += 1
    shutil.copy2(f, nuovo)
    print(f.name, "->", nuovo.relative_to(dst))

Limiti

  • Legge solo .xml: i .xml.p7m vanno estratti prima (oppure usa StudioFatture, che li legge direttamente).
  • In un lotto con più fatture usa i dati della prima.
  • Se il file contiene fatture emesse dal cliente, la cartella sarà quella del cliente del cliente: lancia lo script separatamente su emesse e ricevute.

Risposte rapide

come rinominare automaticamente le fatture xml con nome fornitore e data?
Con lo script qui sopra (nome <data>_<fornitore>_<numero>.xml) o con la rinomina del piano Studio di StudioFatture.
Python: come leggo CedentePrestatore Denominazione e Data da una FatturaPA?
Con ElementTree cercando gli elementi per nome locale (senza prefisso): CedentePrestatore/DatiAnagrafici/Anagrafica/Denominazione e DatiGeneraliDocumento/Data.
Posso usare la rinomina sugli originali da conservare?
Meglio lavorare su copie: gli originali restano legati al nome file indicato nelle ricevute SdI.

Cosa fare adesso

Gratis fino a 5 fatture per volta · Pro €5/mese fino a 500 · Studio €19/mese senza limiti, 3 utenti.

Non vuoi mantenere script? Con Studio hai cartelle per cliente e rinomina automatica, nel browser.

Fonti

Verificato il 12/11/2026. Le regole fiscali possono cambiare: in caso di dubbio fa fede la fonte ufficiale.