尝试基于列值删除基于csv文件的行

时间:2017-05-22 23:02:29

标签: python csv duplicates

我正在尝试根据列是否具有唯一值来删除csv文件中的重复行。我的代码如下所示:

seen = set()
for line in fileinput.FileInput('DBA.csv', inplace=1):
    if line[2] in seen:
        continue # skip duplicated line
    seen.add(line[2])
    print(line, end='')

我正在尝试获取每行中2索引列的值,并检查它是否唯一。但由于某些原因,我看到的集合看起来像这样:

{'b', '"', 't', '/', 'k'}

关于我的逻辑存在缺陷的任何建议?

1 个答案:

答案 0 :(得分:0)

您正在逐行阅读文件,因此当您选择line[2]时,您实际上正在选择每行的第三个字符,而您正在运行此文件。

如果要捕获每行第二列的值,则需要首先解析CSV,例如:

import csv

seen = set()
with open("DBA.csv", "rUb") as f:
    reader = csv.reader(f)
    for line in reader:
        if line[2] in seen:
            continue
        seen.add(line[2])
        print(line)  # this will NOT print valid CSV, it will print Python list

如果你想编辑你的CSV,恐怕会比这复杂一点。如果您的CSV不是很大,您可以将其加载到内存中,截断它然后写下你的行:

import csv

seen = set()
with open("DBA.csv", "rUb+") as f:
    handler = csv.reader(f)
    data = list(handler)
    f.seek(0)
    f.truncate()
    handler = csv.writer(f)
    for line in data:
        if line[2] in seen:
            continue
        seen.add(line[2])
        handler.writerow(line)

否则你必须逐行读取你的文件并使用你将传递给csv.reader()的缓冲区来解析它,检查它的第三列的值,如果没有看到,写入该行的行实时编辑文件。如果看到,你必须在写下一行等之前回到上一行。

当然,如果你知道你的线结构可以简化事情(你不需要处理左右传递缓冲区),你就不需要使用csv模块,但对于一个通用的解决方案,最好让csv模块进行出价。