Si hallas algún problema en tu código o trabajo, recuerda probar siempre en un ambiente de testing antes subir el código al trabajo final.
Solución:
json podría no ser la mejor opción para los formatos en disco; El problema que tiene con la adición de datos es un buen ejemplo de por qué esto podría ser. Específicamente, los objetos json tienen una sintaxis que significa que se debe leer y analizar todo el objeto para comprender cualquier parte de él.
Afortunadamente, hay muchas otras opciones. Uno particularmente simple es CSV; que es bien compatible con la biblioteca estándar de python. El mayor inconveniente es que solo funciona bien para texto; requiere una acción adicional por parte del programador para convertir los valores a números u otros formatos, si es necesario.
Otra opción que no tiene esta limitación es usar una base de datos sqlite, que también tiene soporte incorporado en python. Esto probablemente sería una desviación mayor del código que ya tiene, pero es más compatible con el modelo ‘modificar un poco’ que aparentemente está tratando de construir.
Probablemente quieras usar un JSON lista en lugar de un diccionario como elemento de nivel superior.
Entonces, inicialice el archivo con una lista vacía:
with open(DATA_FILENAME, mode='w', encoding='utf-8') as f:
json.dump([], f)
Entonces tú puedes adjuntar nuevas entradas a esta lista:
with open(DATA_FILENAME, mode='w', encoding='utf-8') as feedsjson:
entry = 'name': args.name, 'url': args.url
feeds.append(entry)
json.dump(feeds, feedsjson)
Tenga en cuenta que esto será lento de ejecutar porque reescribirá el contenido completo del archivo cada vez que llame add
. Si lo está llamando en un bucle, considere agregar todas las fuentes a una lista por adelantado y luego escriba la lista de una sola vez.
Agregue la entrada al contenido del archivo si el archivo existe; de lo contrario, agregue la entrada a una lista vacía y escriba en el archivo:
a = []
if not os.path.isfile(fname):
a.append(entry)
with open(fname, mode='w') as f:
f.write(json.dumps(a, indent=2))
else:
with open(fname) as feedsjson:
feeds = json.load(feedsjson)
feeds.append(entry)
with open(fname, mode='w') as f:
f.write(json.dumps(feeds, indent=2))