Projet programmation

Résolu/Fermé
Utilisateur anonyme - 9 mai 2020 à 23:36
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 - 11 mai 2020 à 00:08
Bonjour,

dans le cadre d'un cours d'université j'ai un projet à faire pour créer un compte bancaire virtuel.
Mon problème est que je n'arrive pas à utiliser mon code à deux reprises, c'est à dire que je crée un fichier mais dans ma classe "__init__" je n'arrive pas à récupérer les données de mes anciens comptes créés. pouvez vous regarder mon code et m'aider à comprendre comment je peux le faire ?

Bien à vous.

Voici mon code :

"Import package"
import json
import os
import random
 

def message (): 
    print('\nBienvenue dans le service Ewallet: \nQue voulez-vous faire ? \n 1 : Créer un nouveaux profil \n 2 : Accéder à un compte existant \n 3 : Quitter les services de Ewallet \n \nVotre entrée :\n')

# Declaration of a global variable because the rate is fixed 
rate = 0.02
Rate = rate * 100
Rate_perc = '{} %'.format(Rate) 
montantDecouvert = 300    
class Ewallet :
    global rate

    def __init__(self,Id,generatedCode,dispoAmount):
        self.Id = Id
        self.generatedCode = generatedCode
        self.dispoAmount = dispoAmount 
        
        #print('Compte {}\nCode Pin {} \nArgentdispo {} '.format(self.Id,self.generatedCode,self.dispoAmount))
            # constructeur est app automatiquement pour avoir dans la variable les diff attributs 
# self pour déclarer les attributs de ma classe  / element appartenant a l objet crée specifiquement    
     
    def Information (self): 
        info = '\nCompte : {}\nCode Pin : {} \nAmount on the account : {} \nfees Debit/Credit : {}'.format(self.Id,self.generatedCode,self.dispoAmount,Rate_perc)
        print(info)
    


    def CreditOp(self,amount):
            self.dispoAmount += amount - (rate*amount) # commission taken by the bank 
            return self.dispoAmount 
    
    def DebitOperation(self,amount):
        if self.dispoAmount > amount + (rate*amount) :
            self.dispoAmount -= amount + (rate*amount)
            return self.dispoAmount
        else : 
            print("Error solde insufissant")
        
            
    def codeVerification(self,code): 
        if (self.generatedCode == code): 
            return True 
        else : 
            return False 
    
    def save(self):
        info = '{:<15s} ¦ {:<15d} ¦ {:<15.2f}  '.format(self.Id,self.generatedCode,self.dispoAmount)
        return info
    # Retunr a string 
    
class Bank : 
    
    def __init__(self):
            self.Liste_Ewallet = []
        
    def saveBank(self): 
        pw = open('Ewallet.txt','w+')
        for index , elem in enumerate(self.Liste_Ewallet) :
            id_count, code_pin, amount_dispo = 'ID Ewallet', 'Code Pin', 'Amount Available'
            pw.write('{:<15} ¦ {:<15} ¦ {:<15} \n'.format(id_count,code_pin,amount_dispo))
            pw.write('{}\n'.format(self.Liste_Ewallet[index].save()))
            pw.write("=============================================================================\n\n")
        pw.close()
        
    
    def existAcc (self,Id_entered): 
        for index, elem in enumerate(self.Liste_Ewallet) : 
            if  self.Liste_Ewallet[index].Id == Id_entered: # chopper le wallet donc peut avoir le id
                return (True,index) 
            
        return (False,0)

    def newWallet (self) :
        # on peut bloquer les entrée pour que l'utilisateur il puisse pas rentrer des string chelou
        client_id = input('Enter an ID to open an account \n>')
        if ',' not in client_id :
            cond, index = self.existAcc(client_id); 
            if cond == False:
                client_id_clean = client_id.replace(" ","")
                print('\nID 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)
                self.Liste_Ewallet.append(wallet)
                print('Information of the account :\n')
                wallet.Information()
                
            else: 
                print('\n Error ! The account already exists !')
                
        else : 
            print('\n Error ! Your name must not contain "," !!') # peu le pimper 
            
    def accountOp(self): 
        client_id_op = input('Enter the account ID \n>')
        cond, index = self.existAcc(client_id_op); 
        if cond == True : 
            print('\nAcoount found !\n')
            ok = False 
            pin_entered = 0
            while ok == False:
                pin_entered = int(input('Enter the account password \n>'))
                ok = True 
            if self.Liste_Ewallet[index].codeVerification(pin_entered):
                print('\nCorrect Pin ')
                print('Connexion completed \n')
                print('\nQue voulez-vous faire ? \n 1 : DEBITER le compte \n 2 : CREDITER le compte \n 3 : INFOS du compte \n 4 : QUITTER le Ewallet \nEntrée :\n')
                op = 0; 
                try : 
                    
                    op = int(input('>'))
                except : 
                    pass
                if op == 1 : 
                    #debit the account 
                    ok = False 
                    amount_deb = 0; 
                    while ok == False and amount_deb <= 0 : 
                        try: 
                            amount_deb = float(input('Enter the amount to debit from the account \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 : 
                    #credi the account 
                    ok = False 
                    amount_cred = 0 ; 
                    while ok == False and amount_cred <= 0: 
                        try :
                            amount_cred = float(input('Enter the credit amount \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('retour menu principal')
                
                else :  
                    print('Error, non valid operation, retour menu principal') 
            else : 
                print('Wrong pin, retour principal menu !\n')
            
        else : 
            print('Account doesnt exist, retour principal menu')
                
                    
                    
                    
    
    
            
def main(): 
    stop = False 
    bank = Bank() # instanciation 
    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('Merci d avoir utilisé les services Ewallet')
            stop = True 
        else : 
            print('Error ! Choix invalide')
        
    
    
    
    
    
    
if __name__ == "__main__":
    main()

6 réponses

Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
Modifié le 10 mai 2020 à 00:53
Bonsoir Yaleck,

Pour récupérer tes données sauvegardées, le plus facile serait de les stocker dans un fichier csv, l'accès sera plus facile par la suite. Pour cela tu as le module
csv
. Tu trouveras des tas d'exemples sur internet. Par exemple : https://riptutorial.com/fr/csv/example/6947/lire-et-ecrire-en-python

Le format bien structuré de ton fichier Ewallet.txt tel que tu l'as conçu, je l'aurais vu davantage pour un fichier visible du client, comme un relevé de compte, donc sans le mot de passe.

Ceci étant dit, si tu souhaites conserver ton format de fichier, tu peux le relire comme indiqué ici :
https://stackoverflow.com/questions/8369219/how-to-read-a-text-file-into-a-string-variable-and-strip-newlines
mais tu auras ensuite quelques manipulations (peut-être fastidieuses à mettre en place) de chaines de caractères pour récupérer tout comme il faut.
0
Utilisateur anonyme
10 mai 2020 à 01:10
Seriez-vous disponible pour m'aider à mettre cela en place ?
0
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
10 mai 2020 à 01:49
Oui, n'hésite pas si tu as des questions. :-)
Comment veux-tu procéder : tu gardes le format que tu as défini dans ton fichier .txt ou tu préfères passer au format .csv ?
0
Utilisateur anonyme
10 mai 2020 à 12:45
j'ai essayé les deux mais je n'y arrive pas, puisque mon code a besoin des classes pour les attributs. Même lorsque j'arrive à recréer une liste avec mes données, je n'arrive pas à les conserver en tant que classes Ewallet je ne peux donc pas les utiliser pour refaire mon fichier et là est tout mon problème.
0
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
10 mai 2020 à 14:13
Bonjour,

Je vais te proposer la version avec csv, mais tu peux aussi l'adapter avec ta structure de fichier :
class Bank : 
    
    def __init__(self):
        self.Liste_Ewallet = []
        # tu ajoutes la lecture de ton fichier ici
        with open('Ewallet.csv','r') as csvEwallet:
            # pour chaque ligne du fichier, tu ajoutes ses éléments dans self.Liste_Ewallet. Les élements seront directement stockés dans une liste, ce qui sera facile à récupérer.
            # quelques lignes de code à écrire ici

        
    def saveBank(self): 
        # j'ai remplacé ta version du fichier pour une écriture dans un csv
        with open('Ewallet.csv','w') as csvEwallet:
            # tu parcours ta Liste_Ewallet, et tu écris dans le csv


Aide-toi des exemples qu'on trouve sur internet. Fais autant de
print
que nécessaire, pour comprendre ce qui va et ce qui ne va pas dans le code. Et dis toi bien que c'est en faisant des erreurs, en pratiquant, que l'on apprend.
Si après tout ça, tu as toujours des blocages, poste ici l'extrait du code que tu as modifié et qui ne fonctionne pas. Je regarderai.

Courage ! :-)
0
Utilisateur anonyme
10 mai 2020 à 17:48
On a essayé de garder le même format mais le problème qui arrive est que notre liste est en string et non un attribut ce qui nous empêche de les reprendre je pense que cela est pareil en cdv ou en txt. Qu'on penses tu ? On a utilisé ce code là :

 def __init__(self): 
        if os.path.exists(r'Ewallet.txt'):
            pw = open('Ewallet.txt','r')
            self.Liste_Ewallet = []
            file_size = os.path.getsize('Ewallet.txt')
            x = 0;
            wallet_pos = 1 ;
            if file_size != 0:
                lines = pw.readlines()
                while x != len(lines):
                    print(wallet_pos)
                    self.Liste_Ewallet.append(lines[wallet_pos])
                    wallet_pos += 4
                    x += 1
                    if wallet_pos == len(lines) + 1:
                        break
        else: 
            self.Liste_Ewallet = []
        
    def saveBank(self): 
        pw = open('Ewallet.txt','w+')
        for index , elem in enumerate(self.Liste_Ewallet) :
            id_count, code_pin, amount_dispo = 'ID Ewallet', 'Code Pin', 'Amount Available'
            pw.write('{:<15} ¦ {:<15} ¦ {:<15} \n'.format(id_count,code_pin,amount_dispo))
            pw.write('{}\n'.format(self.Liste_Ewallet[index].save()))
            pw.write("=============================================================================\n\n")
        pw.close()

0

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

Posez votre question
Utilisateur anonyme
11 mai 2020 à 00:03
j'ai réussi
0
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
11 mai 2020 à 00:08
J'ai répondu un peu tard.
C'est très bien que tu aies réussi par toi-même. :-)
0
Furansujean Messages postés 58 Date d'inscription lundi 1 juillet 2019 Statut Membre Dernière intervention 12 septembre 2022 5
11 mai 2020 à 00:06
Au moment où tu arrives à cette ligne :
                    self.Liste_Ewallet.append(lines[wallet_pos])

tu souhaites ajouter un objet Ewallet à partir des données déjà stockés.
Il faut créer un nouveau Ewallet via l'appel de la méthode __init__:
Ewallet(Id, generatedCode, dispoAmount)
.

Il faut donc commencer par remplacer ta ligne de code à la ligne 12 par :
                    self.Liste_Ewallet.append(Ewallet(Id, generatedCode, dispoAmount))


La question qui se pose à présent est de savoir comment transmettre les données de
lines[wallet_pos]
vers
Id
,
generatedCode
et
dispoAmount
?

Pour cela tu dois passer par exemple de :
lines[wallet_pos]
qui vaut
11              ¦ 156290          ¦ 11.00            
à :
Id, generatedCode, dispoAmount = ['11', '156290', '11.00']
(et ne pas oublier ensuite de transformer en int generatedCode et en float dispoAmount).

Pour répondre à cela, tu peux utiliser la fonction
split
pour couper ta ligne au niveau des
¦
comme séparateurs. Ensuite il faudra enlever les espaces à gauche et à droite : la fonction
strip
fait ça.

En résumé, tu remplaces ta ligne 12 par (à toi de compléter):
#utilisation de split et strip sur la ligne lines[wallet_pos]
Id, generatedCode, dispoAmount = ___ 

generatedCode, dispoAmount = int(generatedCode), float(dispoAmount)
self.Liste_Ewallet.append(Ewallet(Id, generatedCode, dispoAmount))
0