Comment mettre des strings en dictionnaire

Résolu
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 ?

12 réponses

  1. Utilisateur anonyme
     
    ["yal_724851_100.0_{'CHF': 100.0", " 'EUR': 0", " 'USD': 0", " 'GBD': 0}"]
    4
    'GBD': 0}. #cela est mon newliste[3]
    1
    1. Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
       
      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
  2. Utilisateur anonyme
     
    mes dictionnaires sont dans des listes et lorsque je les reprends je ne peux meme plus les mettre ensemble
    0
    1. Utilisateur anonyme
       
      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
      1. Utilisateur anonyme > Utilisateur anonyme
         
        ['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
  3. Utilisateur anonyme
     
     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
  4. Utilisateur anonyme
     
    """
    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
    1. Utilisateur anonyme
       
      si quelqu'un arrive à m'aider je ne sais plus quoi faire
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
     
    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
  7. Utilisateur anonyme
     
    je suis passer en lecture .json
    0
  8. Utilisateur anonyme
     
    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
    1. Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
       
      Je dirais : dans la fonction
      save
      de ta classe
      Ewallet
      : tu remplaces les virgules de ton dictionnaire par des underscore. :-)
      0
  9. Utilisateur anonyme
     
    ahhh oui alors ca me fait bien ça
    0
  10. Utilisateur anonyme
     
    mais comment récupérer maintenant mes variables ?
    0
    1. Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
       
      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
  11. Utilisateur anonyme
     
    mais cela me met des underscore entre les variables mais pas dans le dictionnaire
    0
  12. Utilisateur anonyme
     
    J'ai réussi ! merci beaucoup
    0