【问题标题】:Delete matching values from csv从 csv 中删除匹配值
【发布时间】:2020-09-29 17:05:20
【问题描述】:

使用 DictReader 和 DictWriter 我需要找到 file1.csv 和 file2.csv 之间的匹配值。如果找到匹配项,请将其从 file1.csv 中删除

file1.csv

UserName,LastIP,LastLogon
Jessica_Alba,10.10.10.11,11/14/2019
Karen_Edwards,10.10.10.12,11/14/2019
Tracy_Chung,10.10.10.25,11/15/2019

file2.csv

Department,UserName,LastPasswordReset,LastIP
IT,Jessica_Alba,9/14/2019,10.10.10.11
Accounting,Karen_Edwards,9/14/2019,10.10.10.12

比较两个文件后的预期输出,file1.csv 通过删除匹配的用户进行更新

UserName,LastIP,LastLogon
Tracy_Chung,10.10.10.25,11/15/2019

但是,我的代码似乎并非如此。我做错了什么?

data3 = []

with open("file1.csv","r") as in_file1, open("file2.csv", "r") as in_file2:
    reader1 = csv.DictReader(in_file1)
    reader2 = csv.DictReader(in_file2)
    for row2 in reader2:
        for row1 in reader1:
            print(row1['UserName'])
            if row2['UserName'] != row1['UserName']:

                data3.append(row1)


print(data3)

【问题讨论】:

  • 对于reader2 中的第一行,您的代码正在遍历reader1 的所有行,并且每次都将row2 附加到data3,除了用户名相同的一次。
  • @Wups 我在代码中打错了字。它应该是第 1 行。
  • @Wups 想说的是,您的逻辑中有一个更根本的错误。如果不是因为其他原因导致循环为空(请参阅我的回答),您将多次添加同一个用户。

标签: python python-3.x csv


【解决方案1】:

打开的文件句柄是一个流;只要还有更多行未读,您就可以阅读,但是一旦您阅读了所有行,一次,您就处于流的末尾,进一步的读取将不会产生任何结果。

与其尝试多次循环遍历内部文件,将其读入内存,然后在内存中的数据结构上循环任意多次……或者更好的是,在内存中生成一个数据结构这使您可以直接查看用户是否存在于第二个文件中,因此您根本不需要循环来搜索用户。

import csv


data3 = []

with open("file2.csv", "r") as in_file2:
    reader2 = csv.DictReader(in_file2)
    # Create a set of users
    users = {row2['UserName'] for row2 in reader2}

with open("file1.csv","r") as in_file1:
    reader1 = csv.DictReader(in_file1)
    for row1 in reader1:
        if row1['UserName'] not in users:
            data3.append(row1)

print(data3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2014-09-19
    相关资源
    最近更新 更多