比较文件夹中的所有CSV文件并打印重复的行

时间:2015-01-15 23:10:50

标签: python csv duplicates rows

我在一个文件夹中有多个CSV文件,我想比较并打印匹配的行(列数可能不同)。我知道如何在文件中获取重复项,但这种情况有点不同。假设文件夹中有两个文件,我想比较它们。

CSV1:
H1,H2,H4
C01,23,F
C2,45,M

CSV2:
H1,H2,H3,H4
C01,23,data,F
C01,23,some other data,M
C4,34,data,M

我需要输出来检查所有可用数据(来自列数最少的数据)是否与同一文件夹中的另一个文件完全匹配。我的输出可能就像

CSV1,CSV2 (H1:C01,H2:23,H4:F(H3:data))

1 个答案:

答案 0 :(得分:1)

如下:

def duplines(csv_least_cols, csv_most_cols):
    rowset = set()
    with open(csv_least_cols) as csv1:
        r = csv.reader(csv1)
        csv1_cols = next(r)
        for row in r:
            rowset.add(tuple(row))
    with open(csv_most_cols) as csv2:
        dr = csv.DictReader(csv2)
        for drow in dr:
            refcols = tuple(drow[c] for c in csv1_cols)
            if refcols in rowset: yield csv1_cols, refcols, drow

你可以在循环中调用它并执行你想要的任何格式化 - 这个生成器处理底层逻辑,将格式化任务分离给它的调用者。

例如,为了获得您特有的所需CSV1,CSV2 (H1:C01,H2:23,H4:F(H3:data))样式输出,您可以拥有......:

def formatit(csv_least, csv_most):
    out_start = '{},{} ('.format(csv_least, csv_most)
    for c1cols, refvals, c2dict in duplines(csv_least, csv_most):
        out_middle = []
        for c, v in zip(c1cols, refvals):
            out_middle.append('{}:{}'.format(c, v))
        out_end = []
        for c in c2dict:
            if c in c1cols: continue
            out_end.append('{}:{}'.format(c, c2dict[c]))
        out = '{}{}({}))'.format(out_start, ','.join(out_middle), ','.join(out_end))
        print(out)

您会注意到格式化工作比实际逻辑复杂得多(因此更容易隐藏错误:-)这就是为什么我称之为您想要的格式&#34;特殊的&#34;。< / p>

但是我希望这至少可以让你开始(你可以单独试用每个功能,确保逻辑符合你的需要,然后再担心格式化: - )。