Python:比较两个csv文件并打印出差异

Nic*_*low 10 python csv

我需要比较两个CSV文件并在第三个CSV文件中打印出差异.在我的例子中,第一个CSV是名为old.csv的旧哈希列表,第二个CSV是包含旧哈希和新哈希的新哈希列表.

这是我的代码:

import csv
t1 = open('old.csv', 'r')
t2 = open('new.csv', 'r')
fileone = t1.readlines()
filetwo = t2.readlines()
t1.close()
t2.close()

outFile = open('update.csv', 'w')
x = 0
for i in fileone:
    if i != filetwo[x]:
        outFile.write(filetwo[x])
    x += 1
outFile.close()
Run Code Online (Sandbox Code Playgroud)

第三个文件是旧文件的副本,而不是更新.怎么了 ?我希望你能帮助我,非常感谢!!

PS:我不想使用差异

Chr*_*ler 15

问题是你fileone要将每一行比较到同一行filetwo.只要在一个文件中有一个额外的行,您就会发现这些行永远不会再相等.试试这个:

with open('old.csv', 'r') as t1, open('new.csv', 'r') as t2:
    fileone = t1.readlines()
    filetwo = t2.readlines()

with open('update.csv', 'w') as outFile:
    for line in filetwo:
        if line not in fileone:
            outFile.write(line)
Run Code Online (Sandbox Code Playgroud)


Mil*_*ton 10

你可能会发现这个包很有用(csv-diff):

pip install csv-diff
Run Code Online (Sandbox Code Playgroud)

安装后,您可以从命令行运行它:

csv-diff one.csv two.csv --key=id
Run Code Online (Sandbox Code Playgroud)


sel*_*ler 6

使用集合检测差异感觉很自然。

#!/usr/bin/env python3

import sys
import argparse
import csv


def get_dataset(f):
    return set(map(tuple, csv.reader(f)))


def main(f1, f2, outfile, sorting_column):
    set1 = get_dataset(f1)
    set2 = get_dataset(f2)
    different = set1 ^ set2

    output = csv.writer(outfile)

    for row in sorted(different, key=lambda x: x[sorting_column], reverse=True):
        output.writerow(row)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    parser.add_argument('infile', nargs=2, type=argparse.FileType('r'))
    parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
    parser.add_argument('-sc', '--sorting-column', nargs='?', type=int, default=0)

    args = parser.parse_args()

    main(*args.infile, args.outfile, args.sorting_column)
Run Code Online (Sandbox Code Playgroud)


Adr*_*enW 5

我假设您的新文件与旧文件一样,只是在旧文件之间添加了一些行。两个文件中的旧行以相同的顺序存储。

尝试这个 :

with open('old.csv', 'r') as t1:
    old_csv = t1.readlines()
with open('new.csv', 'r') as t2:
    new_csv = t2.readlines()

with open('update.csv', 'w') as out_file:
    line_in_new = 0
    line_in_old = 0
    while line_in_new < len(new_csv) and line_in_old < len(old_csv):
        if old_csv[line_in_old] != new_csv[line_in_new]:
            out_file.write(new_csv[line_in_new])
        else:
            line_in_old += 1
        line_in_new += 1
Run Code Online (Sandbox Code Playgroud)
  • 请注意,我使用了上下文管理器with和一些有意义的变量名称,这使它立即更容易理解。而且您不需要该csv软件包,因为您在这里没有使用它的任何功能。
  • 关于您的代码,您几乎做对了,除了 _you 不能转到旧 CSV 中的下一行,除非您在两个 CSV 中读取相同的内容。也就是说,如果你找到一个新行,继续阅读新文件,直到你偶然发现一个旧文件,然后你就可以继续阅读了。

更新:这个解决方案不像Chris Mueller 的解决方案那么漂亮,它对于小文件来说是完美且非常 Pythonic 的,但它只读取文件一次(保留原始算法的想法),因此如果你有更大的文件会更好。