0
votes

Suppression d'une ligne d'un fichier csv en fonction de l'entrée utilisateur

Je crée actuellement un programme de gestion de compte où les détails du compte sont stockés dans un fichier .csv, l'utilisateur entrera le nom d'utilisateur du compte qu'il souhaite supprimer mais lorsque je supprime une ligne, cela ne fonctionne pas correctement, si J'utilise le mode "r +", il ne fera rien et quand j'utilise le mode "w", il supprimera le fichier entier lorsque j'essaye de supprimer une seule ligne.

Voici le code ci-dessous pour la fonction de suppression: p>

delUserName = input("enter the username of the account you want to delete")

with open(filename, 'r+') as csvFile:
    reader = csv.reader(csvFile, delimiter=",")
    writer = csv.writer(csvFile, delimiter=",")
    for rows in reader:
        if rows[1] == delUserName:
            writer.writerow("")

Le fichier csv est configuré comme 1, nom d'utilisateur, mot de passe donc les lignes [0] seraient index, les lignes [1] seraient nom d'utilisateur et les lignes [ 2] serait le mot de passe

Toute aide sera très appréciée.


4 commentaires

Vous n'écrivez rien si le nom d'utilisateur n'est pas celui que vous souhaitez supprimer


C'est correct, mais si le nom d'utilisateur est dans le csv, je veux supprimer cette ligne spécifique, si le nom d'utilisateur n'est pas dans le fichier csv, je l'imprimerai sur la console et dirai à l'utilisateur de taper un autre nom d'utilisateur ou d'annuler l'opération


Je n'avais pas remarqué que vous essayiez de lire et d'écrire le même fichier en même temps. Ne faites pas cela, créez un nouveau fichier. Ou utilisez des db.


Ahh ok merci


4 Réponses :


1
votes

C'est une mauvaise idée d'itérer sur les lignes d'un fichier et d'y écrire simultanément. Utilisez un deuxième fichier pour obtenir toutes les lignes du premier fichier à l'exception de celles à supprimer, fermez les deux descripteurs de fichier et enfin déplacez le nouveau fichier à la place de l'ancien. Ou effectuez toutes les modifications en mémoire, puis écrivez-les dans le premier fichier.

Cette question est pour la plupart un double de ce qui suit:

Comment filtrer des données spécifiques de un CSV via Python?


1 commentaires

Merci beaucoup pour votre contribution, je ne mets pas en œuvre le changement maintenant



0
votes

Vérifiez si la valeur existe dans les lignes, si elle existe, supprimez la ligne contenant cette valeur à l'aide de l'index et réécrivez le dataframe.

import pandas as pd
df = pd.read_csv('testFile.csv',index_col='index')
df.head()

if df[df['username'].isin(['satyam'])].shape[0]:
    df = df.drop(df[df.username == 'satyam'].index[-1]).reset_index(drop=True).rename_axis('index')
    print(df)

#to write into csv
df.to_csv('abc.csv')
#reading the new csv with dropped row
pd.read_csv('abc.csv')


0 commentaires

0
votes

Il est plus facile de stocker le nom et le mot de passe sur la même ligne:

Fichier 'accounts.csv':

Enter the username of the account you want to delete: User5
Sorry! Account "User5" not found.

Ensuite, vous peut simplement supprimer la ligne entière:

Enter the username of the account you want to delete: User1
Remove you account: User1

Test 1:

acc = input('Enter the username of the account you want to delete: ')
with open('accounts.csv', 'r') as f:
    accounts = f.readlines()
acc_found = [x for x in accounts if x.split(',')[0].lower() == acc.lower()]
if acc_found:
    print('Remove you account: {}'.format(acc))
    accounts.remove(acc_found[0])
    with open('accounts.csv', 'w') as f:
        f.write(''.join(accounts))
else:
    print('Sorry! Account "{}" not found.'.format(acc))

Test 2:

User1,Password1
User2,Password2
User3,Password3


0 commentaires

1
votes

C'est plus facile si vous utilisez le dataframe pandas: csvfile: testGen.csv # juste pour l'exemple

df = df[~df["username"].str.contains("user2", na=False)].to_csv('testGen1.csv', index = False)

voici les exemples de données que le fichier csv contient et voici comment supprimer la ligne que vous voulez

import pandas as pd
df=pd.read_csv("testGen.csv")
df = df[~df["username"].str.contains("user2", na=False)]

then your answer will be:
username    password
0   user1   123
2   user3   344
3   user4   122

Si vous voulez vider le fichier csv directement, écrivez simplement:

    username    password
  0     user1   123
  1     user2   223
  2     user3   344
  3     user4   122


0 commentaires