我正在尝试根据列是否具有唯一值来删除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'}
关于我的逻辑存在缺陷的任何建议?
答案 0 :(得分: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
模块进行出价。