Vai al contenuto
ApriFattura

Per commercialisti e studi

Come rinominare automaticamente le fatture XML con fornitore e data

Aggiornato il · Redazione ApriFattura

Per rinominare automaticamente le fatture XML con fornitore e data bisogna leggere da ogni file la denominazione (o nome e cognome) del CedentePrestatore e i campi Data e Numero di DatiGeneraliDocumento. Lo script Python qui sotto, basato su xml.etree.ElementTree e indipendente dai prefissi di namespace, rinomina i file in AAAA-MM-GG_Fornitore_Numero.xml; il piano Studio di ApriFattura fa lo stesso senza script.

Campi usati per il nuovo nome
Parte del nomeCampo FatturaPA
AAAA-MM-GGFatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/Data
FornitoreCedentePrestatore/DatiAnagrafici/Anagrafica/Denominazione oppure Nome + Cognome
NumeroDatiGeneraliDocumento/Numero (caratteri non validi sostituiti da -)

Lo script

Funziona con Python 3 senza librerie esterne. Salta i file .p7m (vanno prima estratti, vedi estrarre i p7m) e i file dei metadati SdI (_MT_). Con --prova mostra i nuovi nomi senza rinominare. Puoi anche scaricarlo.

#!/usr/bin/env python3
"""Rinomina le fatture elettroniche XML come AAAA-MM-GG_Fornitore_Numero.xml.
Uso: python3 rinomina_fatture.py /percorso/cartella [--prova]
"""
import re
import sys
import xml.etree.ElementTree as ET
from pathlib import Path


def locale(tag):
    return tag.rsplit("}", 1)[-1]


def trova(el, *nomi):
    """Primo discendente che segue il percorso di nomi locali (ignora i namespace)."""
    for nome in nomi:
        el = next((c for c in el.iter() if c is not el and locale(c.tag) == nome), None)
        if el is None:
            return None
    return el


def testo(el, *nomi):
    t = trova(el, *nomi) if el is not None else None
    return t.text.strip() if t is not None and t.text else ""


def pulisci(s, maxlen=60):
    s = re.sub(r'[\\/:*?"<>|\s]+', "-", s).strip("-.")
    return s[:maxlen] or "senza-nome"


def nuovo_nome(file):
    root = ET.parse(file).getroot()
    cedente = trova(root, "CedentePrestatore")
    fornitore = testo(cedente, "Denominazione") or " ".join(
        x for x in (testo(cedente, "Nome"), testo(cedente, "Cognome")) if x
    )
    dgd = trova(root, "DatiGeneraliDocumento")
    data = testo(dgd, "Data")
    numero = testo(dgd, "Numero")
    return f"{data}_{pulisci(fornitore)}_{pulisci(numero, 30)}.xml"


def main():
    cartella = Path(sys.argv[1] if len(sys.argv) > 1 else ".")
    prova = "--prova" in sys.argv
    for f in sorted(cartella.iterdir()):
        nome = f.name.lower()
        if nome.endswith(".p7m"):
            print(f"SALTATO (firmato, estrai prima l'XML): {f.name}")
            continue
        if not nome.endswith(".xml") or "_mt_" in nome:
            continue
        try:
            dest = f.with_name(nuovo_nome(f))
        except ET.ParseError:
            print(f"ERRORE (XML non valido): {f.name}")
            continue
        n = 2
        while dest.exists() and dest != f:
            dest = dest.with_name(f"{dest.stem.rsplit('~', 1)[0]}~{n}.xml")
            n += 1
        print(f"{f.name} -> {dest.name}")
        if not prova:
            f.rename(dest)


if __name__ == "__main__":
    main()

Come usarlo

  1. Copia le fatture in una cartella di lavoro (mai sugli unici originali).
  2. Lancia python3 rinomina_fatture.py /percorso/cartella --prova e controlla i nomi proposti.
  3. Rilancia senza --prova per rinominare. Se due fatture produrrebbero lo stesso nome, la seconda riceve un suffisso ~2.

Note tecniche

  • Il confronto avviene sul nome locale dei tag, quindi funziona con qualsiasi prefisso (p:, ns2: o nessuno).
  • Nei file con più fatture (lotti) viene usata la prima DatiGeneraliDocumento.
  • Rinominare i file di lavoro non modifica il contenuto; per la conservazione a norma mantieni i file così come ricevuti dallo SdI.

Senza script: piano Studio

Con il piano Studio la rinomina per fornitore e data è un pulsante nella modalità in blocco, funziona anche sui .p7m e non richiede Python sui computer dello studio.

Risposte rapide

come rinominare automaticamente le fatture xml con nome fornitore e data?
Usa lo script Python di questa pagina, o la rinomina automatica del piano Studio di ApriFattura.
come controllare velocemente il contenuto di una fattura xml prima di registrarla?
Apri i file nella modalità in blocco per una tabella con numero, data, fornitore e totale.
come archiviare le fatture elettroniche ricevute in pdf?
Per la consultazione puoi salvarle in PDF con nomi ordinati (data_fornitore_numero); la conservazione a norma riguarda comunque i file XML. Vedi valore legale del PDF.

Cosa fare adesso

Preferisci un pulsante allo script? La rinomina per fornitore e data è inclusa nel piano Studio.

Scopri il piano Studio

Fonti

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