2
votes

Comment apporter des modifications persistantes à un dictionnaire?

J'essaie de créer une petite application qui calculerait le poids de la charge en fonction de la définition stockée des matériaux / concentrations.
De temps en temps, le dict doit être mis à jour et stocké pour une utilisation future.

L'extrait ci-dessous demande à un utilisateur de fournir de nouvelles valeurs pour le dict, puis le met à jour.

baseDict={'a':10, 'b':20, 'c':30, 'd':40}
def updateDict(key, value):
    temp = {key : value}
    baseDict.update(temp)
    return baseDict

key = str(input('Enter key\n'))
value = input('Enter value\n')
baseDict = updateDict(key, value)

Le problème est que lorsque le shell est redémarré, le baseDict revient aux valeurs d'origine.
J'ai trouvé des solutions pour une question similaire à partir de ~ 2010, mais ils utilisent Pickle, shelve, JSON pour stocker / récupérer le dict dans un fichier séparé et le charger à chaque fois que le code est exécuté.

Je prévois de transformez le code en un petit fichier .exe à exécuter sur un ordinateur sans py.
Toute suggestion sur la façon de mettre à jour baseDict dans un tel environnement serait grandement appréciée.

Merci!


3 commentaires

json fait partie de la bibliothèque principale de python. Pourquoi ne voudriez-vous pas l'utiliser?


Merci pour le commentaire, John. Je veux rendre le programme aussi autonome que possible. Puis-je utiliser JSON et toujours transformer le code en .exe? qu'en est-il d'ajouter une interface graphique avec tkinter avant exe?


Il semble que vous souhaitiez mélanger les données utilisateur et le code. Ce n'est pas une bonne idée.


3 Réponses :


0
votes

Vous pouvez l'enregistrer au format txt, puis le recharger.

Exécutez donc un code par lui-même, comme ci-dessous:

import ast
with open('test.txt','r') as f:
    baseDict=ast.literal_eval(f.read().rstrip())

def updateDict(key, value):
    temp = {key : value}
    baseDict.update(temp)
    return baseDict

key = str(input('Enter key\n'))
value = input('Enter value\n')
baseDict = updateDict(key, value)
with open('test.txt','w') as f:
    f.write(str(baseDict))

Ensuite, exécutez un autre module avec le code ci-dessous:

with open('test.txt','w') as f:
    f.write("{'a':10, 'b':20, 'c':30, 'd':40}")


6 commentaires

@ Smith788483 N'oubliez pas d'accepter ma réponse si cela fonctionne :-), veuillez également voter si cela fonctionne: D


@ Smith788483 Heureux d'aider, :-), 😊😊😊


@ Smith788483 Acceptez d'abord ma réponse, vous obtiendrez +2 de réputation, puis vous pourrez voter :-)


@ Smith788483 De plus, vous obtiendrez un badge pour accepter :-)


LOL ... Je vois comment ça marche :) Eh bien ... gardons-le ouvert un peu avant d'accepter, voyons quelles autres solutions existent :)


@ Smith788483 J'ai cherché partout, en fait, ma réponse est la seule.



0
votes

Comme je le sais, la seule façon de conserver les modifications de ce type est d'utiliser le stockage local. Cela peut être avec Jsons, des fichiers texte, des bases de données, même si vous pouvez créer votre propre type de fichier encodé. Cependant, la majorité des applications doivent être installées, peut-être que vous pouvez inscrire vos données et les stocker dans des fichiers secrets dans un répertoire créé par l'application lors du processus d'installation.


1 commentaires

Merci Andres. Cela aide vraiment beaucoup!



0
votes

Il est préférable d'utiliser json ou pickle que d'enregistrer le texte brut et de le ast.literal_eval . Je recommanderais json :

Pour json , exécutez d'abord ceci une fois:

import json

with open('baseDict.json','r') as f:
    baseDict = json.load(f)

# your code

with open('baseDict.json', 'w') as f:
    json.dump(baseDict, f)

Ensuite: p >

import json

with open('baseDict.json', 'w') as f:
    json.dump({'a':10, 'b':20, 'c':30, 'd':40}, f)

Voir ici pour savoir pourquoi json est meilleur que ast.literal_eval.


1 commentaires

Merci, Timothy. J'apprécie la ligne d'explication.