2017-06-15 208 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