2

[使用 Python3] 我有一个 csv 文件,我想读取并删除重复的“特殊”情况。该脚本应将重复数据删除的 csv 输出到 csv,同时尊重标头。

最好是举例说明。csv 文件看起来像这样:

ID  Name    HeaderX HeaderY HeaderZ ...
1   A       string  float   string  ...
1   A       string  float   string  ...
1   A       string  float   string  ...
2   A       string  float   string  ...
2   B       string  float   string  ...
3   A       string  float   string  ...
4   B       string  float   string  ...
5   C       string  float   string  ...
6   D       string  float   string  ...
... ...     ...     ...     ...     ...

这里有 ID=1 和 ID=2 的重复行,但是我想保留名称相同的所有重复行。所以在这个例子中,我想保留 ID=1 的所有实例,但删除 ID=2 的所有实例。换句话说,删除名称具有多个变体的所有重复行。(这有意义吗?!)

目前我有以下代码(如下),基于这个线程。然而,它的作用恰恰相反,根据两列删除重复项并保留 ID=2 的所有实例并删除 ID=1 的行。

另外,理想情况下,我希望脚本打印它删除的重复数。

import csv

filename = 'testing.csv'
outfile = 'outfile.csv'

with open(outfile, 'w') as fout:
    writer = None
    entries = set()
    with open(filename, 'r') as fin:
        reader = csv.DictReader(fin)

        if not writer:
            writer = csv.DictWriter(fout, lineterminator='\n', fieldnames=reader.fieldnames)
            writer.writeheader()

        for row in reader:
            key = (row['ID'], row['Name'])

            if key not in entries:
                writer.writerow(row)
                entries.add(key)
4

1 回答 1

2

如果行按 ID 排序,您可以使用以下代码。

import csv
import itertools
import operator

filename = 'testing.csv'
outfile = 'outfile.csv'
ndups = 0

with open(filename, 'r') as fin, open(outfile, 'w') as fout:
    reader = csv.DictReader(fin)
    writer = csv.DictWriter(fout, lineterminator='\n', fieldnames=reader.fieldnames)
    for id_, grp in itertools.groupby(reader, key=operator.itemgetter('ID')):
        rows = list(grp)
        if len({row['Name'] for row in rows}) > 1:
            ndups += len(rows)
            continue
        writer.writerows(rows)

print('{} duplicates.'.format(ndups))
于 2013-06-21T11:19:56.350 回答