2014-11-02 71 views
0

我有兩個文件一個包含由tab分隔的數據列表,第二個包含項目的id列表是一個字段。我想比較大文件(file1)中的每個第一個字段與最小文件(file2)中的所有行/項目id,然後如果比較的id不存在於第二個文件中,我想寫所有與第一個文件中的比較項目(這是由製表符分隔的行內容)。我嘗試了下面的代碼,但它有for循環的問題。第一個循環不增加,而第二個循環則循環所有第二個文件行。另外,我希望項目編號被寫入一次,這是If語句中的問題。比較兩個文本文件,以刪除較長的一個重複

for lines in alldata: 
    for lines1 in olddata: 
    old_data=lines1.split('\r\n') 
    dataId=old_data[0] 
    data=lines.split('\t') 
    photoid=data[0] 
    if photoid==dataId: 

    break 

    else: 
    #continue 
    #print('matching',lines) 
    #break 
     w=open(head+'......................../1.txt','a') 
     w.write(lines) 

這是文件結構的一個示例:

15463774518 2014-10-28 08:12:31 2014-10-28 13:12:31 
15628560471 2014-10-26 07:40:28 2014-10-26 12:40:28 
15444098878 2014-10-26 04:49:19 2014-10-26 09:49:19 
15437269197 2014-10-25 09:55:11 2014-10-25 15:55:11 

小文件看起來像:

139747955 
2417570005 
2478707302 
1808883457 
211514265 
+0

這將是非常有用的看到您的文件內容的示例。另外,你可以給文件大小的指針嗎?它們是否足夠小以存儲在內存中? – 2014-11-02 06:49:37

+0

這些文件具有不同的大小,因爲我使用不同大小的數據,對於大文件最小。大小是50KB,一些文件超過5MB。較小的文件最大爲20KB。 – Samah 2014-11-02 07:16:17

回答

0

我建議以下僞代碼。檢查id文件1是否在id文件2中的pythonic方法是從文件2獲得一個id列表,並說if id in idlist:

假設您已將第二個文件的所有ID都讀取到列表idlist_file2。 然後你讀取一個文件。解析你的線,只需檢查

with open(file1,'r') as f: 
    for line in f: 
     data = parse_line(line) # function according to your data format, either return a dict or a tuple what ever works best for you 
     if date['id'] not in idlist_file2: 
      do_something_with_this_info(data) 

這應該給你一個很好的起點。

+0

謝謝,完美的作品 – Samah 2014-11-04 04:24:38

0

我會被誘惑的第二個文件加載到一個字典,然後解析第一個文件並嘗試將第一列的行與字典鍵相匹配

keys_dict = {} 
f = open('smallfile.txt','r') 
for line in f.readlines(): 
    keys_dict[line] = 1 
f.close() 

我不是超級pythonista,但你應該明白。

然後,當你閱讀你的大文件,檢查

if first_column_value in keys_dict:

+0

匹配我會在字典中遇到\ r \ n的問題。 – Samah 2014-11-02 08:29:32

+0

你可以使用string.replace(「\ r \ n」,「」)或strip(「\ r \ n」)將它們刪除。 – Eric 2014-11-02 08:32:04