Cuaderno · 14 de noviembre de 2026
Ficheros llenos de ceros tras un corte de luz
linuxpythonhallazgo
Un programa no arrancaba porque su fichero de estado estaba lleno de bytes nulos. La causa y el arreglo.
Síntoma: después de un apagón, un JSON de estado ocupaba lo mismo de siempre pero era todo \x00, y el programa caía en bucle con JSONDecodeError. Pasa cuando el sistema se apaga mientras se escribe el fichero: el tamaño queda reservado, pero los datos no llegan al disco.
Arreglo: no escribir nunca encima del fichero bueno. Escribir en uno temporal, forzar que llegue al disco y sustituir de golpe:
import json, os
def guardar(ruta, datos):
tmp = ruta + ".tmp"
with open(tmp, "w") as f:
json.dump(datos, f)
f.flush()
os.fsync(f.fileno())
os.replace(tmp, ruta) # atómico: queda el viejo o el nuevo, nunca uno a medias
Y al leer, si está dañado, apartarlo y seguir en vez de romperse:
try:
estado = json.load(open(ruta))
except (ValueError, OSError):
os.rename(ruta, ruta + ".dañado")
estado = {}
Comprobar si un fichero es todo ceros:
python3 -c "b=open('estado.json','rb').read(); print(len(b), b.count(0))"