J'ai le code suivant, qui passe par les étapes de lecture d'un fichier ligne par ligne, de le convertir en une liste, de modifier un champ dans cette liste, mais la dernière étape consiste à réécrire le fichier d'origine, avec cette modification incluse.

Je serais intéressé par les réponses qui suggèrent la solution la plus simple / la plus simple (sans l'utilisation de pandas / numpy, etc.) et en utilisant le code d'origine fourni.

Mon algorithme actuel inclut de devoir créer un nouveau fichier avec tous les enregistrements, sauf celui lié à ce nom d'utilisateur, puis d'écrire dans cette liste. Cela semble ardu et inutile. Toutes les solutions reçues avec gratitude!

La tâche est expliquée plus clairement dans les commentaires:

Code

 """ ==============TASK
    ALLOW THE USER TO CHANGE OR EDIT THEIR PASSWORD
    1. Search for any given username
    2. Edit the password field for that given username
    3. Save the new updated username and password to file / updated
    """

    import csv
    def main():
        #1. This code snippet asks the user for a username and then allows them to change password for that record
        updatedlist=[]
        with open("fakefacebook.txt",newline="") as f:
          reader=csv.reader(f)
          print("CHANGE PASSWORD?!")
          username=input("Enter the username for the required user:")
          for row in reader: #for every row in the file
              for field in row:

                    if field==username: #if a field is == to the required username
                        updatedlist.append(row) #add each row, line by line, into a list called 'udpatedlist'
                        newpassword=input("Enter new password")
                        #print(updatedlist[0][1]) (this is how we get at the password field, noting it is a nested list)
                        updatedlist[0][1] = newpassword #set the field for password to the new password


          updatepassword(updatedlist)

    def updatepassword(updatedlist):
        with open("fakefacebook.txt","w",newline="") as f:
            Writer=csv.writer(f)
            Writer.writerows(updatedlist)
            print("File has been updated")


    main()

Remarque: pour le moment, le code permet simplement à l'utilisateur de modifier le mot de passe (et cela est modifié dans la liste). La liste comprend uniquement l'enregistrement de cet utilisateur. Il écrase cet enregistrement unique (avec le mot de passe modifié) dans le fichier texte, au lieu de ce qui est requis (contenu du fichier d'origine + juste cette modification)

Contenu du fichier

username,password,email,no_of_likes
marvR,pass123,marv@gmail.com,400
smithC,open123,cart@gmail.com,200
blogsJ,2bg123,blog@gmail.com,99

Sortie requise

Si testé avec: marvR changez le mot de passe en: boo123

Le nouveau fichier doit contenir:

username,password,email,no_of_likes
marvR,**boo123**,marv@gmail.com,400
smithC,open123,cart@gmail.com,200
blogsJ,2bg123,blog@gmail.com,99

Tout commentaire / explication sur la meilleure façon d'aborder cela pour enseigner aux débutants serait également apprécié. Il semble étrange que Python n'ait pas développé un module quelconque pour rendre l'édition d'un champ dans un fichier plus facile que cet algorithme en 3 étapes qui est vraiment assez ardu pour les débutants (je parle des 13-14 ans).

2
MissComputing 25 juil. 2017 à 19:13

2 réponses

Meilleure réponse

La réponse de @ VPfB doit également être prise en considération.

Ceci est juste la réponse à la mise à jour des enregistrements sans remplacer vos enregistrements existants dans le fichier. Mais il existe de meilleures façons de procéder.

import csv

def main():
    #1. This code snippet asks the user for a username and then allows them to change password for that record
    updated_list = []
    cached_list = []

    with open("fakefacebook.txt", newline="") as f:
        reader = list(csv.reader(f)) # Convert iterable to list to make things easier.
        print("CHANGE PASSWORD?!")
        username=input("Enter the username for the required user: ")
        cached_list = reader # store copy of data.

        for row in reader: #for every row in the file
            for field in row:  
                if field == username: #if a field is == to the required username
                    updated_list.append(row) #add each row, line by line, into a list called 'udpated_list'
                    newpassword = input("Enter new password: ")
                    #print(updatedlist[0][1]) (this is how we get at the password field, noting it is a nested list)
                    updated_list[0][1] = newpassword #set the field for password to the new password

        update_password(updated_list, cached_list)

def update_password(updated_list, cached_list):
    for index, row in enumerate(cached_list):
        for field in row:
            if field == updated_list[0]:
                cached_list[index] = updated_list # Replace old record with updated record.

    with open("fakefacebook.txt","w", newline="") as f:
        Writer=csv.writer(f)
        Writer.writerows(cached_list)
        print("File has been updated")


main()
1
JClarke 2 janv. 2018 à 20:35

Vous pouvez utiliser un dictionnaire au lieu d'une structure de données de liste ici. Les dictionnaires mappent les valeurs sur des clés définies par l'utilisateur plutôt que sur des entiers. Ainsi, au lieu de dire de parcourir une liste pour trouver le nom d'utilisateur correct, vous pouvez simplement stocker le fichier entier dans une structure de données et utiliser un accès aléatoire pour modifier le nom d'utilisateur souhaité:

from collections import defaultdict
def main():
        inputDict=defaultdict(string)
        with open("fakefacebook.txt",newline="") as f:
          reader=csv.reader(f)
          for row in reader: #for every row in the file
              line = row.split(',') #splits the CSV row into an array

              #sets the key to be the username, and everything else 
              #to be value, and then adds it to inputDict
              inputDict[line[0]] = line[1:] 

          print("CHANGE PASSWORD?!")
          username=input("Enter the username for the required user:")
          newpassword=input("Enter new password")
          if (inputDict[username]):
              inputDict[username] = newpassword
          else: print("No such username!")


          updatepassword(inputDict)

Vous devrez modifier votre updatepassword() pour fonctionner avec un dictionnaire.

0
Aditya Gune 25 juil. 2017 à 16:35