2016-08-17 186 views
3

。 在我的情况下,第一个CSV是一个名为old.csv的旧哈希列表,第二个CSV是包含旧哈希和新哈希的哈希新列表。的Python:比较两个CSV文件,并打印出来,我需要比较两个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() 

第三个文件是旧的副本,而不是更新。 有什么问题?我希望你能帮助我,非常感谢!

PS:我不想使用diff

+1

不是一个答案,而是一个评论:在Linux下,你可以简单地在命令行上执行'diff file1 file2'。 – Jan

+1

看看'difflib'看到:http://stackoverflow.com/questions/19120489/compare-two-files-report-difference-in-python –

+0

对不起,我不想difflib –

回答

5

的问题是,您在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) 
+0

非常感谢! 它工作得很好! –

+0

@NickYellow没问题。仅供参考,通常最好的做法是使用'with open()as'语句打开文件,以便在发生错误时正确关闭它们。 –

+0

你是对的。感谢您的帮助。 –

3

我假定你的新文件只是喜欢你的旧人,除了一些系旧之间自动加入。两个文件中的旧行都以相同的顺序存储。

试试这个:

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 
  • 请注意,我用的上下文管理with和一些有意义的变量名,这使得瞬间更容易理解。你不需要csv包,因为你在这里没有使用它的任何功能。
  • 关于你的代码,你几乎做正确的事情,但_you不能去到下一行的旧CSV,除非你正在阅读这两个CSV的同样的事情。也就是说,如果你找到一条新线,继续阅读新文件,直到你偶然发现一个新文件,然后你就可以继续阅读。

UPDATE:该解决方案是不一样漂亮Chris Mueller's one这是完美的,对小文件非常Python化,但只有一次读取文件(保持原来的算法的思想),从而可以更好如果你有更大的文件。

+0

非常感谢您的帮助! –

+0

不客气。请注意,提高答案是比在这里的评论更感谢,这是实际的奖励货币;) – BusyAnt

+0

嘿,我不是说你不应该接受克里斯的答案;)选择是你的。我们称之为“upvote”的是答案分数旁边的小箭头;) – BusyAnt

相关问题