Das ist eine komische Logik... ich musste da erst genau hinsehen, um zu begreifen, dass Du die Datei "leer" anlegst, wenn diese nicht geöffnet werden konnte.
Lesen und Schreiben würde ich komplett trennen, also eine Funktion ``dump`` und eine ``load`` oder so ähnlich.
Wenn Die Datei (noch) nicht existiert, dann gib einfach ein *leeres* Dictionary zurück
Das ist imho das sinnvollere Vorgehen!
Und fange niemals *alle* Exceptions ab, sondern nur die, auf die Du reagieren willst. In Deinem Falle also eine ``FileNotFoundError``-Exception.
Ansonsten: Ja, so werden die Dateien automatisch geschlossen.