Comment mettre des strings en dictionnaire

Résolu
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. ["yal_724851_100.0_{'CHF': 100.0", " 'EUR': 0", " 'USD': 0", " 'GBD': 0}"]
    4
    'GBD': 0}. #cela est mon newliste[3]
    1. 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.
  2. mes dictionnaires sont dans des listes et lorsque je les reprends je ne peux meme plus les mettre ensemble
    1. 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 = []
      
      
      
      
      
      
    2. @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
  3.  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
    1. """
      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()
      
      
      1. si quelqu'un arrive à m'aider je ne sais plus quoi faire
    2. 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.
      1. 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 ?
        1. Je dirais : dans la fonction
          save
          de ta classe
          Ewallet
          : tu remplaces les virgules de ton dictionnaire par des underscore. :-)
      2. mais comment récupérer maintenant mes variables ?
        1. 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". :-)
      3. mais cela me met des underscore entre les variables mais pas dans le dictionnaire