Comment mettre des strings en dictionnaire
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour, dans mon travail je dois créer un ewallet, mais mon problème est que j'ai des types de variables qui changent de types quand je les reprends d'un fichier, ce sont des dictionnaires qui deviennent des strings et je ne peux plus les utiliser pour les remettre dans mes fonctions. Que faire ?
A voir également:
- Comment mettre des strings en dictionnaire
- Télécharger dictionnaire larousse pdf gratuit - Télécharger - Dictionnaires & Langues
- Télécharger dictionnaire médical larousse gratuit pdf - Télécharger - Dictionnaires & Langues
- Télécharger dictionnaire informatique gratuit pdf - Télécharger - Bureautique
- Dictionnaire synonyme gratuit - Télécharger - Études & Formations
- Dictionnaire des maladies et traitement - Télécharger - Bureautique
12 réponses
["yal_724851_100.0_{'CHF': 100.0", " 'EUR': 0", " 'USD': 0", " 'GBD': 0}"]
4
'GBD': 0}. #cela est mon newliste[3]
4
'GBD': 0}. #cela est mon newliste[3]
mes dictionnaires sont dans des listes et lorsque je les reprends je ne peux meme plus les mettre ensemble
voici mon code
class Bank :
def __init__(self):
if os.path.exists(r"Ewallet.csv"):
self.Liste_Ewallet = []
with open('Ewallet.csv', 'r') as file:
reader = csv.reader(file)
wallet_list = []
for row in reader:
wallet_list.append(row)
for i in range(len(wallet_list)):
newListe = []
newListe = wallet_list[i]
print(wallet_list[i])
print(len(newListe))
print(newListe[3])
newListe[0], newListe[1] , newListe [2] , newListe [3:4] = str(newListe[0]), int(newListe[1]) , float(newListe[2]), dict(newListe[3:4])
wallet_1 = Ewallet(newListe[0],newListe[1],newListe[2], newListe[3:6])
self.Liste_Ewallet.append(wallet_1)
else:
self.Liste_Ewallet = []
def saveBank(self):
pw = open('Ewallet.csv','w')
for index , elem in enumerate(self.Liste_Ewallet) :
pw.write('{}\n'.format(self.Liste_Ewallet[index].save()))
pw.close()
voila comment je sauve les informations
"""
Ewallet Services main file
"""
import random
import csv
import os
import requests
# Currency converter function
def message ():
print('\n\t##Welcome to Ewallet Services## \n\nWhich action would you like to take? \n\n 1 : Create a new profile \n 2 : Access to an existing account \n 3 : Quit Ewallet Services \n')
rate = 0.02
Rate = rate * 100
Rate_perc = '{} %'.format(Rate)
montantDecouvert = 300
class Ewallet :
# dispo amount par defaut en CHF
def __init__(self,Id,generatedCode,dispoAmount,accounts):
self.Id = Id
self.generatedCode = generatedCode
self.dispoAmount = dispoAmount
self.accounts = {'CHF' : dispoAmount, 'EUR' : 0, 'USD' : 0 , 'GBD' : 0}
def Information (self):
info = '\nCompte : {}\nCode Pin : {} \nAmount on the account : {} \nfees Debit/Credit : {} \nDiff accounts {}'.format(self.Id,self.generatedCode,self.dispoAmount,Rate_perc,self.accounts)
print(info)
def CreditOp(self,amount):
self.dispoAmount += amount - (rate*amount)
return self.dispoAmount
def DebitOperation(self,amount):
if self.dispoAmount > amount + (rate*amount) :
self.dispoAmount -= amount + (rate*amount)
return self.dispoAmount
else :
print("Inssuficient funds")
def codeVerification(self,code):
if (self.generatedCode == code):
return True
else :
return False
def save(self):
info ='{:},{:},{:},{:}'.format(self.Id,self.generatedCode,self.dispoAmount,self.accounts)
return info
def covertisseur_currencies (self,from_currency, to_currency, amount): # to currency on applique la conv
rates = {}
url = "https://api.exchangeratesapi.io/latest"
data = requests.get(url).json()
rates = data["rates"]
if to_currency == "EUR" and from_currency != "EUR" :
amount = round(amount / rates[from_currency], 4)
return amount
elif from_currency == "EUR" and to_currency == "EUR":
amount = round(amount, 4)
return amount
else:
amount = round(amount * rates[to_currency], 4)
return amount
class Bank :
def __init__(self):
if os.path.exists(r"Ewallet.csv"):
self.Liste_Ewallet = []
with open('Ewallet.csv', 'r') as file:
reader = csv.reader(file)
wallet_list = []
for row in reader:
wallet_list.append(row)
for i in range(len(wallet_list)): # ajouter le -1
newListe = []
newListe = wallet_list[i]
print(newListe[3])
newListe[0], newListe[1] , newListe [2] , newListe [3] = str(newListe[0]), int(newListe[1]) , float(newListe[2], dict(newListe[3]))
wallet_1 = Ewallet(newListe[0],newListe[1],newListe[2], newListe[3])
self.Liste_Ewallet.append(wallet_1)
else:
self.Liste_Ewallet = []
def saveBank(self):
pw = open('Ewallet.csv','w')
for index , elem in enumerate(self.Liste_Ewallet) :
pw.write('{}\n'.format(self.Liste_Ewallet[index].save()))
pw.close()
def existAcc (self,Id_entered):
for index, elem in enumerate(self.Liste_Ewallet) :
if self.Liste_Ewallet[index].Id == Id_entered:
return (True,index)
return (False,0)
def blockEntry (self,client_id):
char = ['é','è','à','ê','ç',
',','.',';',':','-','?','!','/','"',
'%','(',')','=','+','*','@','¦','|']
list_count = []
exist = False
for spec in char :
count_char = 0
count_char = client_id.count(spec)
list_count.append(count_char)
for index , elem in enumerate(list_count):
if list_count[index] > 0 :
exist = True
return exist
else :
pass
return exist
def newWallet (self) :
client_id = input('Enter an ID to open an account \n>')
if self.blockEntry(client_id) == False :
cond, index = self.existAcc(client_id);
if cond == False:
client_id_clean = client_id.replace(" ","")
print('ID accepted\n')
ok = False
initial_amount = 0;
while ok == False and initial_amount <= 0 :
try :
initial_amount = float(input('Enter an amount \n>'))
if initial_amount <= 0 :
print('\nError! The amount entered must be positive !\n')
else :
print('Amount accepted\n')
ok = True
except :
print('\nError! The amount entered must be positive !\n')
numerical_code = random.randrange(0,1000000)
wallet = Ewallet(client_id_clean,numerical_code,initial_amount,0)
self.Liste_Ewallet.append(wallet)
print('Information of the account:\n')
wallet.Information()
else:
print('\nError! This ID is already taken!\nBack to main menu')
else :
print('\nError! Your ID cannot contain sepcial characters\nBack to main menu')
def accountOp(self):
client_id_op = input('Enter the account ID \n>')
cond, index = self.existAcc(client_id_op);
if cond == True :
print('\nAccount found!\n')
ok = False
pin_entered = 0
try :
while ok == False:
pin_entered = int(input('Enter the account password \n>'))
ok = True
except:
pass
if self.Liste_Ewallet[index].codeVerification(pin_entered):
print('\nCorrect Pin ')
print('Connexion completed \n')
print('Which action would you like to take ? \n 1 : DEBIT \n 2 : CREDIT \n 3 : INFO \n 4 : QUIT \n 5 : convertisseur')
op = 0;
try :
op = int(input('>'))
except :
pass
if op == 1 :
ok = False
amount_deb = 0;
while ok == False and amount_deb <= 0 :
try:
amount_deb = float(input('Enter the amount to be debited \n>'))
except :
print()
if amount_deb <= 0 :
print('\nError! The amount entered must be positive!\n')
else :
ok = True
self.Liste_Ewallet[index].DebitOperation(amount_deb)
self.Liste_Ewallet[index].Information()
elif op == 2 :
ok = False
amount_cred = 0 ;
while ok == False and amount_cred <= 0:
try :
amount_cred = float(input('Enter the amount to be credited \n>'))
except:
print()
if amount_cred <= 0 :
print('\nError! The amount entered must be positive!\n')
ok = True
self.Liste_Ewallet[index].CreditOp(amount_cred)
self.Liste_Ewallet[index].Information()
elif op == 3 :
self.Liste_Ewallet[index].Information()
elif op == 4 :
print('Back to main menu')
elif op == 5 :
choice = input('1. to buy\n2. to sell\n>')
monaie_1 = input('monnaie de base >')
monaie_2 = input('monnaie deux >')
montant = float(input('montant >'))
wallet_1 = self.Liste_Ewallet[index]
if choice == '1':
wallet_1.accounts[monaie_1] = wallet_1.accounts[monaie_1] + montant
wallet_1.accounts[monaie_2] = round(wallet_1.accounts[monaie_2] - wallet_1.covertisseur_currencies(monaie_1,monaie_2,montant),2)
print("Update >",wallet_1.accounts)
elif choice == '2':
wallet_1.accounts[monaie_1] = wallet_1.accounts[monaie_1] - montant
wallet_1.accounts[monaie_2] =round(wallet_1.accounts[monaie_2] + wallet_1.covertisseur_currencies(monaie_1,monaie_2,montant),2)
print("Update >",wallet_1.accounts)
else :
print('Error, invalid operation, back to main menu')
else :
print('Wrong pin, back to main menu !\n')
else :
print('Account does not exist, back to main menu')
def main():
stop = False
bank = Bank()
while stop == False:
message()
op = 0
try :
op = int(input('>'))
except:
print()
if op == 1 :
bank.newWallet()
elif op == 2 :
bank.accountOp()
elif op == 3 :
bank.saveBank()
print('Thank you for using Ewallet Services')
stop = True
elif op == 4:
pass
else :
print('Error! Invalid choice')
if __name__ == "__main__":
main()
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonsoir Yaleck,
comme tu le constates on ne peut pas construire un dictionnaire directement comme tu le fais.
Enfin... on peut construire un dictionnaire à la manière dont tu veux le faire.
Exemple sur une console :
Eh oui ! Il te "suffit" de passer une expression syntaxiquement correcte à
Bon... je te l'accorde, il faut réfléchir un peu pour ton exemple... :-)
En effet, quand tu demandes à lire le csv, cela te facilite le travail quand le séparateur est une virgule. Mais, dans ton cas :
La lecture du csv a découpé ton dictionnaire en plusieurs morceaux, là où il a vu des virgules en fait.
Je te propose donc d'aborder le découpage d'une autre façon.
je vois 2 solutions :
Tu enregistres tes données en séparant les éléments de ton dictionnaire par autre chose qu'une virgule. Ce pourrait être "_" par exemple dans ton fichier :
Par contre, il faut être sûr de ne pas avoir d'autres virgules dans tes données du dictionnaire.
Le 3e élément de la liste issue du découpage csv sera donc le dictionnaire complet avec des "_" comme séparateur, il te reste alors à faire un
Passer à une lecture de fichier sans le module csv :
Plus loin, tu utilises
comme tu le constates on ne peut pas construire un dictionnaire directement comme tu le fais.
Enfin... on peut construire un dictionnaire à la manière dont tu veux le faire.
Exemple sur une console :
>>> d = eval("{'a':1,'b':2}")
>>> d
{'a': 1, 'b': 2}
>>> d['a']
1
Eh oui ! Il te "suffit" de passer une expression syntaxiquement correcte à
eval.
Bon... je te l'accorde, il faut réfléchir un peu pour ton exemple... :-)
En effet, quand tu demandes à lire le csv, cela te facilite le travail quand le séparateur est une virgule. Mais, dans ton cas :
['lambert', '59776', '200.0', "{'CHF': 200.0", " 'EUR': 0", " 'USD': 0", " 'GBD': 0}"]
La lecture du csv a découpé ton dictionnaire en plusieurs morceaux, là où il a vu des virgules en fait.
Je te propose donc d'aborder le découpage d'une autre façon.
je vois 2 solutions :
- Solution 1
Tu enregistres tes données en séparant les éléments de ton dictionnaire par autre chose qu'une virgule. Ce pourrait être "_" par exemple dans ton fichier :
lambert,59776,200.0,{'CHF': 200.0_ 'EUR': 0_ 'USD': 0_ 'GBD': 0}
Par contre, il faut être sûr de ne pas avoir d'autres virgules dans tes données du dictionnaire.
Le 3e élément de la liste issue du découpage csv sera donc le dictionnaire complet avec des "_" comme séparateur, il te reste alors à faire un
replacede "_" en "," puis un
eval.
- Solution 2
Passer à une lecture de fichier sans le module csv :
with open('Ewallet.csv', 'r') as file:
wallet_list = []
for row in file:
wallet_list.append(row)
Plus loin, tu utilises
spliten précisant le séparateur :
trois_premiers_champs, dictionnaire = # séparation sur newListe au niveau de l'accolade ouvrante, qui sera donc le séparateur
Id, generatedCode, dispoAmount,_ = # séparation des trois_premiers_champs avec séparateur virgule
account = eval("{"+dictionnaire) # on remet l'accolade ouvrante qu'on a perdu lors du premier split
- Après il existe d'autres solutions, comme ne pas enregistrer de dictionnaire dans ton fichier, et accéder aux données d'une autre manière.
je n'ai pas réussi par Json... mais comment je peux insérer des underscore dans mon fichier ? puisque justement je stock mes valeurs dans un fichier csv et les récupère par la suite. Pouvez-vous m'éclairer ?
lambert,59776,200.0,{'CHF': 200.0_ 'EUR': 0_ 'USD': 0_ 'GBD': 0}, dans , tu dois uniquement modifier ton dictionnaire : tu passes en puis tu remplaces les virgules qui sont à l'intérieur de cet attribut dictionnaire.