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.
| Dato | Percorso XML | Uso |
|---|---|---|
| Cliente | FatturaElettronicaHeader/CessionarioCommittente/DatiAnagrafici | Cartella di primo livello |
| Fornitore | FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici | Nome file |
| Data | FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/Data | Anno e prefisso del nome |
| Numero | …/DatiGeneraliDocumento/Numero | Nome 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.p7mvanno 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
- Python – xml.etree.ElementTree
- Specifiche tecniche del formato FatturaPA v1.4 (PDF)
- FatturaPA – Formato e specifiche tecniche (fatturapa.gov.it)
Verificato il 12/11/2026. Le regole fiscali possono cambiare: in caso di dubbio fa fede la fonte ufficiale.