【发布时间】: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 变量中跟踪它。我错过了什么吗?