2016-06-23 261 views
-2

我有一個非常奇怪的問題。我有三個文件,其中包含一列數字。我只需要從第一個文件中獲取唯一值,這些值不會出現在第二個和第三個文件中。兩個文件比較

我試過的Python這樣的:

for e in firstfile: 
    if e not in secondfile: 
     resultfile.append(e) 
return resultfile 

而同爲第三檔。

我試過的uniq,排序,DIFF,一些AWK腳本和通訊在Linux的shell喜歡這裏:Fast way of finding lines in one file that are not in another?

但唯一的結果,每次我得到的是線條的相同數額,因爲這是在以往的第一個文件。我一點都不明白!

也許,我錯過了什麼?也許這是一種格式?不過,我查了很多次。這裏是文件:http://dropmefiles.com/BaKGj

P.S.後來我認爲根本沒有獨特的線條,但我手動檢查了它,第一個文件中的一些數字是唯一的。

P.P.S.文件的格式是這樣的:

380500100000 
380500100001 
380500100002 
380500100003 
380500100004  
380500100005 
380500100008 
380500100020 
380500100022 
380500100050  
380500100070 
380500100080 
+0

如果它只是一列數字,那麼您應該包含20個來自eacg的數據,這樣我們就可以瞭解您使用的數據。將這些文件放在Dropmefiles中將不會在將來7天內移除文件。我也會加載第一個文件,然後刪除從第二個和第三個文件加載的所有內容(如果它存在於第一個文件中)。 – IvanD

+0

當然,這是一個不錯的音符。你是俄羅斯人嗎? – tiredsys

回答

2

什麼是錯

而同爲第三檔

如果你真的做同爲第三檔,即第一檔的原始內容與比較第三,你可以引入不在第二個文件但在第三個文件中的項目的重複項。例如:

 
file 1: 
1 
2 
3 

file 2: 
1 

file 3: 
2 

處理文件2之後,將resultfile然後,處理文件3後含有2和3,resultfile將含有2和3(從第一次運行) 1和3,即2, 3,1,3。但是,結果應該是3.

從代碼中不清楚您是否實際將每次運行的輸出寫入文件resultfile。如果是,則應將其用作第二次和後續運行的輸入,不要再處理第一個文件。


一個更好的辦法來解決它

如果你不需要從第一個文件保存行的順序,你可以使用set.difference()這樣的:

with open('file1') as f1, open('file2') as f2, open('file3') as f3: 
    unique_f1 = set(f1).difference(f2, f3) 

注意這將包括文件中存在的任何空格(包括換行符)。如果你想忽略每行開頭和結尾的空白:

from itertools import chain 

with open('file1') as f1, open('file2') as f2, open('file3') as f3: 
    unique_f1 = set(map(str.strip, f1)).difference(map(str.strip, chain(f2, f3))) 

如果你正在使用Python 2然後任選爲了提高效率,進口itertools.imap並使用它,而不是map()上述假設的Python 3。

或者,你可能會喜歡把數據作爲數字(我假定float這裏,但你可以使用int代替):

from itertools import chain 

with open('file1') as f1, open('file2') as f2, open('file3') as f3: 
    unique_f1 = set(map(float, f1)).difference(map(float, chain(f2, f3))) 
+0

我明白你的觀點,但我的代碼比這更復雜。我只是不想粘貼所有這些,所以我更容易理解。最初,我打開了csv文件,從它們列出了列表,然後迭代第一個列表的每個元素並將其存儲在結果列表中。然後,我將第一次迭代的結果列表作爲第三個列表(文件),結果存儲在另一個列表中,後來寫入第四個(結果)csv文件。 – tiredsys

0

最簡單的方法將每個文件讀入set,然後使用Python(非常有效)集合運算來進行比較。

file1 = set() 
file2 = set() 

for element in firstfile: 
    file1.add(element) 

for element in secondfile: 
    file2.add(element) 

unique = file1 - file2 
+0

我試過這樣的設置: 1.通過csv模塊在Python中打開csv文件。 2.從這些文件中提取所有數據並將其轉移到列表中。 3.從這些列表中進行設置。 4.試過你建議的結構(unique = file1 - file2)。 它有相同的效果,或者我應該嘗試你的選擇? – tiredsys

+0

這將工作正常。我只是用那個(低效率)構造,因爲我不確定你是如何將文件讀入內存的。 – Batman

0

很可能這個問題可能是first.csv嚴格ASCII文本,而second.csvthird.csv是ASCII文本,帶有CRLF行結束符。我建議你將它們改爲相同的格式(ASCII文本可能效果最好)。

$ file first.csv 
first.csv: ASCII text 

$ file second.csv 
second.csv: ASCII text, with CRLF line terminators 

$ file third.csv 
third.csv: ASCII text, with CRLF line terminators