Comment mettre des strings en dictionnaire

Résolu/Fermé
Utilisateur anonyme - 13 mai 2020 à 16:46
 Utilisateur anonyme - 14 mai 2020 à 01:06
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:

12 réponses

Utilisateur anonyme
14 mai 2020 à 00:35
["yal_724851_100.0_{'CHF': 100.0", " 'EUR': 0", " 'USD': 0", " 'GBD': 0}"]
4
'GBD': 0}. #cela est mon newliste[3]
1
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
Modifié le 14 mai 2020 à 00:42
Pour avoir
lambert,59776,200.0,{'CHF': 200.0_ 'EUR': 0_ 'USD': 0_ 'GBD': 0}
, dans
save
, tu dois uniquement modifier ton dictionnaire : tu passes
self.accounts
en
str
puis tu remplaces les virgules qui sont à l'intérieur de cet attribut dictionnaire.
0
Utilisateur anonyme
13 mai 2020 à 16:47
mes dictionnaires sont dans des listes et lorsque je les reprends je ne peux meme plus les mettre ensemble
0
Utilisateur anonyme
13 mai 2020 à 16:48
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 = []





0
Utilisateur anonyme > Utilisateur anonyme
13 mai 2020 à 16:51
['lambert', '59776', '200.0', "{'CHF': 200.0", " 'EUR': 0", " 'USD': 0", " 'GBD': 0}"]

voila quand je print mon wallet_list[1]

mais mon dictionnaire est maintenant un string
0
Utilisateur anonyme
13 mai 2020 à 17:24
 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
0
Utilisateur anonyme
13 mai 2020 à 19:30
"""
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()

0
Utilisateur anonyme
13 mai 2020 à 19:31
si quelqu'un arrive à m'aider je ne sais plus quoi faire
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
Modifié le 13 mai 2020 à 23:31
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 :
>>> 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
replace
de "_" 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
split
en 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.
0
Utilisateur anonyme
13 mai 2020 à 23:43
je suis passer en lecture .json
0
Utilisateur anonyme
13 mai 2020 à 23:53
merci
0
Utilisateur anonyme
14 mai 2020 à 00:10
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 ?
0
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
Modifié le 14 mai 2020 à 00:28
Je dirais : dans la fonction
save
de ta classe
Ewallet
: tu remplaces les virgules de ton dictionnaire par des underscore. :-)
0
Utilisateur anonyme
14 mai 2020 à 00:29
ahhh oui alors ca me fait bien ça
0
Utilisateur anonyme
14 mai 2020 à 00:29
mais comment récupérer maintenant mes variables ?
0
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
14 mai 2020 à 00:33
Fais un
print
de
newListe[3]
et tu verras comment récupérer tout ça.
Et tu suis ce que j'ai marqué dans ma "Solution 1". :-)
0
Utilisateur anonyme
14 mai 2020 à 00:30
mais cela me met des underscore entre les variables mais pas dans le dictionnaire
0
Utilisateur anonyme
14 mai 2020 à 01:06
J'ai réussi ! merci beaucoup
0