Python - 在csv文件中显示具有重复值的行

时间:2014-07-11 12:51:24

标签: python csv dictionary

我有一个包含多个列的.csv文件,其中一列填充了随机数,我想在那里找到重复的值。如果有 - 奇怪的情况,但这毕竟是我要检查的 - 我想显示/存储存储这些值的完整行。

为了说清楚,我有这样的想法:

  

首先,无论如何,230,无论如何等    第二,无论如何,11,无论如何等    第三,无论如何,46,无论如何等    第四,无论如何,18,无论如何等    第五,无论如何,14,无论如何等    第六,无论如何,48,无论如何等    第七,无论如何,91,无论如何等    第八,无论如何,18,无论如何等    第九,无论如何,67,无论如何等等

我想:

  第四,无论如何,18,无论如何等    第八,无论如何,18,无论如何等等

为了找到重复的值,我将该列存储到字典中,并计算每个键以便发现它们出现的次数。

import csv
from collections import Counter, defaultdict, OrderedDict

with open(file, 'rt') as inputfile:
        data = csv.reader(inputfile)

        seen = defaultdict(set)
        counts = Counter(row[col_2] for row in data)

print "Numbers and times they appear: %s" % counts

我看到了

  

反击({'18':2,'46':1,'67':1,'48':1,......})

问题出现了,因为我没有设法将密钥与重复链接并稍后进行计算。如果我做

for value in counts:
        if counts > 1:
            print counts

我只会拿钥匙,这不是我想要的和每一个价值(更不用说我不仅要打印而是打印整条线......)

基本上我正在寻找一种做法

If there's a repeated number:
        print rows containing those number
else
        print "No repetitions"

提前致谢。

3 个答案:

答案 0 :(得分:3)

尝试这可能对你有用。

entries = []
duplicate_entries = []
with open('in.txt', 'r') as my_file:
    for line in my_file:
        columns = line.strip().split(',')
        if columns[2] not in entries:
            entries.append(columns[2])
        else:
            duplicate_entries.append(columns[2]) 

if len(duplicate_entries) > 0:
    with open('out.txt', 'w') as out_file:
        with open('in.txt', 'r') as my_file:
            for line in my_file:
                columns = line.strip().split(',')
                if columns[2] in duplicate_entries:
                    print line.strip()
                    out_file.write(line)
else:
    print "No repetitions"

答案 1 :(得分:1)

您应该像下面这样创建字典,这样重复的条目就不会相互覆盖:

if(dict.has_key(num) == 0):
     dict[num] = []
     dict[num].append(val)
else:
     dict[num].append(val)

然后遍历字典中的每个列表值,如果某个键的值大于1,则它会出现不止一次。

答案 2 :(得分:0)

让我们循环浏览文件两次:

  • 首先记录每个第3列出现的次数。
  • 通过行打印第二行,打印包含多次出现的第3列。

请参阅:

awk -F, 'FNR==NR{a[$3]++; next}
         {if (a[$3]>1) {print}}' file file

测试

$ awk -F, 'FNR==NR{a[$3]++; next} {if (a[$3]>1) {print}}' a a
Fourth, Whatever, 18, Whichever, etc
Eighth, Whatever, 18, Whichever, etc