根据用户输入从csv文件中删除一行

时间:2019-03-15 11:04:47

标签: python csv

我当前正在创建一个帐户管理程序,该帐户的详细信息存储在.csv文件中,用户将输入他们想要删除的帐户的用户名,但是当我删除一行时,如果该行不能正常工作,我使用“ r +”模式实际上不会做任何事情,当我使用“ w”模式时,当我尝试删除一行时,它将删除整个文件。

以下是删除功能的代码:

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("")

csv文件设置为1,username,password,因此,行[0]将是索引,行[1]将是用户名,行[2]将是密码

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

遍历文件的行并同时写入文件是一个坏主意。使用第二个文件从第一个文件获取除要删除的行以外的所有行,关闭两个文件句柄,最后将新文件移到旧文件位置。或执行内存中的所有更改,然后将它们写入第一个文件。

此问题大部分是以下内容的重复:

How to filter out specific data from a CSV via Python?

答案 1 :(得分:1)

使用pandas数据框会更容易: csvfile:testGen.csv#仅用于示例

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

这是csv文件包含的示例数据,这是删除所需行的方法

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

如果要直接将其转储为csv文件,只需编写:

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

答案 2 :(得分:0)

检查该行中是否存在该值,如果存在,则使用索引删除包含该值的行并重写数据框。

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')

答案 3 :(得分:0)

更容易在同一行上存储名称和密码:

文件'accounts.csv'

User1,Password1
User2,Password2
User3,Password3

然后您可以简单地删除整行:

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))

测试1:

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

测试2:

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