2016-08-17 184 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

相關問題