Sabato 24 ottobre 2026
L’edizione di oggi
Millebit
AI · Software · QA
Il segnale, non il rumore.

Gli articoli di Millebit sono scritti con l’intelligenza artificiale a partire da fonti citate in ogni pezzo. Come lavoriamo

QA e affidabilità

Riscrivere un JSON con open(path,'w') può lasciare il file vuoto, usa os.replace

Testo scritto con l’intelligenza artificiale a partire da una fonte citata, senza revisione umana prima della pubblicazione.

Su Linux con Python 3.10.12 svuotare il file prima di riscriverlo espone i lettori a JSONDecodeError; scrivere su un temporaneo e poi os.replace evita la finestra corrotta.

Illustrazione generata con l’intelligenza artificiale

Un lettore apre l’indice JSON e trova il nulla: JSONDecodeError: Expecting value: line 1 column 1 (char 0)1.

Due script girano in parallelo. Uno aggiorna un indice di clip video, l’altro lo legge per costruire una pagina. Quasi sempre funziona. A volte il lettore becca il file proprio mentre lo scrittore lo sta riscrivendo e vede un file vuoto. I test sono su Linux con Python 3.10.12, in una cartella temporanea, con output incollati senza modifiche1.

Le prove mostrano tre fatti. Primo: open(path, 'w') tronca subito il file, prima di qualsiasi byte nuovo. Se un lettore interroga in quel momento, gli errori superano di molto i successi1. Secondo: se il processo che scrive si interrompe a metà, perdi anche la versione precedente. Resta un frammento, senza nulla a cui tornare1. Terzo: scrivere su un file temporaneo nello stesso percorso e poi sostituire con os.replace elimina la finestra di vuoto. Con questo cambio, il lettore non incontra file rotti1.

La causa è pratica. La riscrittura “in place” apre una finestra in cui il file esiste ma è vuoto. Un lettore che lo apre in quel tempo fallisce con l’errore sopra. Non è una corruzione a valle, è tempismo sbagliato1.

Il rimedio cambia la sequenza. Si scrive tutto su un temporaneo, si forza a disco, poi si sostituisce il file vero. Il lettore vede sempre un file intero, o la versione vecchia o la nuova. Nei test, zero letture spezzate1.

Esempio minimo in Python:

  • scrivi tutto su un file temporaneo nella stessa cartella
  • fsync, per assicurare che i dati arrivino a disco
  • sostituisci in un colpo con os.replace

Esempio:

import json, os, tempfile

data = {"clips": [...]}
dst = "index.json"

fd, tmp = tempfile.mkstemp(dir=".", prefix=dst + ".", suffix=".tmp")
try:
    with os.fdopen(fd, "w") as f:
        json.dump(data, f)
        f.flush()
        os.fsync(f.fileno())
    os.replace(tmp, dst)
finally:
    try:
        os.remove(tmp)
    except FileNotFoundError:
        pass

Attorno a questo schema l’autore segnala tre trappole, utili a delimitare il perimetro operativo1:

  • lo svuotamento immediato con open(..., 'w'): è l’inconsistenza che vuoi evitare, quindi non riscrivere “in place”;
  • l’interruzione a metà: se il writer cade durante la scrittura diretto sul file vero, lasci un frammento e perdi lo stato precedente;
  • la finestra di lettura nel mezzo: un lettore che apre tra il troncone e il riempimento vede il vuoto e fallisce.

Checklist essenziale per implementare senza sorprese:

  • scrivi su un file temporaneo nello stesso percorso del bersaglio;
  • chiudi e fsync il temporaneo prima della sostituzione;
  • sostituisci con os.replace, in modo che il passaggio da vecchio a nuovo sia unico per i lettori;
  • non usare open(path, 'w') sul file reale;
  • non lasciare lettori osservare file parziali, punta sempre al percorso finale già sostituito1.

Fonti

  1. Rewriting a JSON File in Place Let My Reader See It Half-Written: Temp File, fsync, os.replace and Three Traps dev.to · 23 ottobre 2026
Come è nato questo articolo Scritto da un sistema di intelligenza artificiale, con controlli automatici

Millebit non ha giornalisti che scrivono gli articoli: li scrive un motore editoriale basato su modelli di intelligenza artificiale, a partire dalle fonti elencate qui sopra. Prima di uscire, ogni testo passa questi controlli:

  • Fedeltà alle fonti. Un secondo passaggio toglie ogni affermazione che le fonti non sostengono. Valutazione su questo pezzo: 9/10.
  • Anti-cliché. Un filtro scarta frasi fatte, enfasi e tic della prosa artificiale: superato.
  • Giudizio editoriale. Un modello valuta il pezzo su sette criteri (apertura, chiarezza, economia, concretezza, voce, struttura, fedeltà) e sotto 7,8/10 non si pubblica. Questo articolo ha preso 8,2/10 dopo 1 revisione.

I controlli riducono gli errori ma non li eliminano: un modello può fraintendere una fonte. Per le decisioni importanti, risali alla fonte originale. Se trovi un errore, segnalacelo.

Come funziona Millebit, nel dettaglio →

Hai trovato un errore? Segnalacelo
Tipo di segnalazione

Leggiamo ogni segnalazione. Le correzioni fatte sono elencate in Correzioni. L’email, se la lasci, serve solo a risponderti.