2017-06-15 210 views
1

我試圖讓我的代碼刪除.csv文件的重複就地。可以發現http://www.sharecsv.com/s/29ae855f20472de54b12fa66bbe3cbb9/DBA.csvPython刪除重複項。

我該怎麼做的建議,最終的代碼看起來像這樣:

def deleteDuplicate(): 
    seen = set() 
    dupeCount = 0 
    counter = 0 
    with FileInput('DBA.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: 
       dupeCount+=1 
       continue 
      seen.add(row[2]) 
      counter+=1 
      print(line, end='') 
     print(counter) 
     print("Removed {} Duplicates".format(dupeCount)) 

上面的代碼可以完美的在一個較小的試驗規模,如消除重複:

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

當我在我的較大的.csv文件上運行它時,它將完全刪除重複項,但最終刪除了另外4行。刪除的4行沒有在我的dupeCount中跟蹤,所以他們不應該觸發我的if語句。

我必須承認,我不太確定itertools使用的tee()的用法以及爲什麼它是有益的。

我的2個問題是: 爲什麼deleteDuplicate()刪除較大的.csv文件中的4行,爲什麼使用了tee()和zip?

+2

我以前從未見過tee功能。 'pandas'模塊有一個'drop_duplicates'方法,它完全符合你在這裏所做的。考慮使用它來代替;沒有重新發明車輪的意義。文檔在這裏:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html –

+0

假設你還沒有看到這個,這裏是'itertools.tee()'的文檔' https://docs.python.org/2/library/itertools.html#itertools.tee – 16num

+0

我已閱讀文檔並理解zip()和tee()。我只是不明白在這裏的好處。 – Rainoa

回答

1

看數據的第一行,則說明有換行符在裏面「\ N」(以及逗號),所以我們有7個數據

Date,Price DKK,URL,Description 
19/5,1 kr.,http://www.dba.dk/8660-vegavej-1-14/id-102010171/,"8660, Vegavej 1-14, hel�rsgrund, Boligprojekt s�lges 1-14 boliger 
R�kkehusene ligger ud til et stort smukt fredet omr�de. Alle boliger har private sydvendte haver, som ligger direkte ud til et f�lles omr�de. Der er altan, hvorfra der er udsigt over det facinerende og karakteristiske landskab med �l�b, heste, gravh�j. 
Aktiv fritid og lokalmilj�. 
Tebstrup er en lille landsby med 660 indbyggere. I byen er der skole, b�rnehave m.m 
se" 
19/5,1.599.000 kr.,http://www.dba.dk/7800-4-103-372-2013/id-93506363/,"7800 4, 103, 372, 2013, Fyrt�jet 8, 7656, 6130, 80000, Villa" 

的「行」,但如果與閱讀csv(和excel)換行符被引用封裝,所以它只有一行。

with open("output.csv") as f : 
    for row in csv.reader(f): 
     print(row) 

['Date', 'Price DKK', 'URL', 'Description'] 
['19/5', '1 kr.', 'http://www.dba.dk/8660-vegavej-1-14/id-102010171/', '8660, Vegavej 1-14, hel\xef\xbf\xbdrsgrund, Boligprojekt s\xef\xbf\xbdlges 1-14 boliger\r\nR\xef\xbf\xbdkkehusene ligger ud til et stort smukt fredet omr\xef\xbf\xbdde. Alle boliger har private sydvendte haver, som ligger direkte ud til et f\xef\xbf\xbdlles omr\xef\xbf\xbdde. Der er altan, hvorfra der er udsigt over det facinerende og karakteristiske landskab med \xef\xbf\xbdl\xef\xbf\xbdb, heste, gravh\xef\xbf\xbdj.\r\nAktiv fritid og lokalmilj\xef\xbf\xbd.\r\nTebstrup er en lille landsby med 660 indbyggere. I byen er der skole, b\xef\xbf\xbdrnehave m.m\r\nse'] 
['19/5', '1.599.000 kr.', 'http://www.dba.dk/7800-4-103-372-2013/id-93506363/', '7800 4, 103, 372, 2013, Fyrt\xef\xbf\xbdjet 8, 7656, 6130, 80000, Villa'] 

文件的行可能不等於csv數據中的行。

編輯

附加到你的測試文件,以確認你可能會看到什麼。

null,first,second,third 
zero,one,two,"three 
,four 
five\r\n" 
null,first,second,third 
nul,un,deux,trois 
0,"1,one",2,3 
+0

謝謝你一噸。你突出了我的問題。我還是不明白第一行是如何讓我失去了csv中最後4行的。但通過刪除第一行,它刪除了4站。 – Rainoa