2017-05-22 95 views
1

我試圖根據列是否具有唯一值來刪除csv文件中的重複行。我的代碼如下所示:試圖根據列值刪除基於csv文件的行

seen = set() 
for line in fileinput.FileInput('DBA.csv', inplace=1): 
    if line[2] in seen: 
     continue # skip duplicated line 
    seen.add(line[2]) 
    print(line, end='') 

我試圖在每一行中獲取2索引列的值,並檢查它是否是唯一的。但由於某種原因,我看到的集看起來像這樣:

{'b', '"', 't', '/', 'k'} 

任何意見,我的邏輯有瑕疵?

+2

該生產線是迭代的字符,而不是領域。要使用字段,您需要使用'csv.reader',而不是'fileinput'。 – wim

+0

我的理解fileinput允許我編輯文件就地。這也可以用於csv.reader嗎? – Rainoa

+0

@Rainoa很確定'fileinput'只是創建一個內存中的備份來「就地修改」。你可以手動做到這一點。它的主要用例是使用*多個文件*,但是對於單個文件,這非常簡單。 –

回答

0

你正在逐行閱讀你的文件,所以當你選擇line[2]時,你實際上是在選擇你正在運行的每一行的第三個字符。

如果你想要捕捉的每一行第二列的值,你需要先分析你的CSV,是這樣的:

import csv 

seen = set() 
with open("DBA.csv", "rUb") as f: 
    reader = csv.reader(f) 
    for line in reader: 
     if line[2] in seen: 
      continue 
     seen.add(line[2]) 
     print(line) # this will NOT print valid CSV, it will print Python list 

如果你想編輯您的CSV到位恐怕它會比這更復雜一點。如果您的CSV不是很大,你可以在內存中加載它,截斷它,然後寫下你的臺詞:

import csv 

seen = set() 
with open("DBA.csv", "rUb+") as f: 
    handler = csv.reader(f) 
    data = list(handler) 
    f.seek(0) 
    f.truncate() 
    handler = csv.writer(f) 
    for line in data: 
     if line[2] in seen: 
      continue 
     seen.add(line[2]) 
     handler.writerow(line) 

否則,你就必須按行讀入文件行並使用一個緩衝區,你會傳遞給csv.reader()來解析它,檢查它的第三列的值,如果沒有看到,寫行到實時編輯文件。如果看到了,你必須在寫下一行之前回溯到上一行。

當然,如果你知道你的行結構,那麼你不需要使用csv模塊,這可以簡化事情(你不需要處理左右傳遞緩衝區),但對於通用解決方案,建議讓csv模塊進行出價。

0

可以使用fileinput來就地重寫,並使用csv閱讀器按字段進行閱讀。

import csv 
from fileinput import FileInput 
from itertools import tee 

seen = set() 
with FileInput('/tmp/thing.csv', inplace=1) as f: 
    f, f_orig = tee(f) 
    for row, line in zip(csv.reader(f), f_orig): 
     if row[2] in seen: 
      continue 
     seen.add(row[2]) 
     print(line, end='') 

我測試了它工作正常使用該輸入文件:

null,first,second,third 
zero,one,two,three 
zero_dupe,one_dupe,two,three_dupe 
nul,un,deux,trois 
0,"1,one",2,3 

正確的輸出應該被寫在就地申報:

null,first,second,third 
zero,one,two,three 
nul,un,deux,trois 
0,"1,one",2,3 
+0

您的解決方案有效。由於某種原因,每次運行它時都會刪除4行。 這是我的csv文件:http://www.sharecsv.com/s/29ae855f20472de54b12fa66bbe3cbb9/DBA.csv 我試圖做一個計數器,它不會被檢測到「看到」,但由於某種原因,4行得到每次打印(line,end ='')代碼 – Rainoa