【问题标题】:Python removing duplicates.Python 删除重复项。
【发布时间】:2017-06-15 19:34:07
【问题描述】:

我正在尝试让我的代码删除 .csv 文件的重复内容。可以找到http://www.sharecsv.com/s/29ae855f20472de54b12fa66bbe3cbb9/DBA.csv

我收到了关于如何操作的建议,最后得到的代码如下所示:

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() 的用途以及为什么它是有益的。

我的两个问题是: 为什么 deleteDuplicate() 会删除较大的 .csv 文件中的 4 行,为什么要使用 tee() 和 zip?

【问题讨论】:

  • 我以前从未见过 tee 功能。 pandas 模块有一个 drop_duplicates 方法,可以完全按照您在此处执行的操作。考虑改用它;重新发明轮子没有意义。此处的文档:pandas.pydata.org/pandas-docs/stable/generated/…
  • 假设你还没有看过这个,这里是itertools.tee()docs.python.org/2/library/itertools.html#itertools.tee的文档
  • 我已阅读文档并了解 zip() 和 tee()。我只是不明白在这里拥有它的好处。
  • 我认为该功能没有问题。您发布的 csv 文件有 2036 行 (\n),但 csv 模块按照设计在最后一个单元格中读取带有引号的字符串 ("\n\n\n") 的第一个数据行。所以你最终有 2032 行。
  • @corn3lius 我不确定你的意思?当我运行它时,它会删除 4 个实际唯一的行,并且不会在稍后打印出来的 dupeCount 变量中跟踪它。我错过了什么吗?

标签: python csv zip


【解决方案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

【讨论】:

  • 非常感谢。你为我强调了这个问题。我仍然不明白第一行是如何让我在 csv 中丢失最后 4 行的。但是通过删除第一行,它使删除 4 停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2016-07-26
  • 2019-05-12
  • 2015-12-29
  • 2012-10-09
  • 2011-10-04
  • 2014-06-08
相关资源
最近更新 更多