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 Réponses :
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?
Merci beaucoup pour votre contribution, je ne mets pas en œuvre le changement maintenant
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')
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
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
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