【问题标题】:Python - Display rows with repeated values in csv filesPython - 在 csv 文件中显示具有重复值的行
【发布时间】:2014-09-02 02:35:15
【问题描述】:

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

为了说清楚,我有这样的东西:

首先,随便,230,随便,等等
二、随便、11、随便等
三、随便、46、随便等
四、随便、十八、随便等
五、随便、14、随便等
六、随便、48、随便等
七、随便、91、随便等
八、随便、十八、随便等
九、随便、67、随便等

我想拥有:

第四,随便,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"

提前致谢。

【问题讨论】:

  • 在 awk 中可以作为答案吗?这很简单。
  • 是的...如你所愿。我完全没有 AWK 的背景,但由于 Python 是一种多范式语言,因此也许可以调整解决方案。

标签: python csv dictionary


【解决方案1】:

试试这个可能对你有用。

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"

【讨论】:

  • 它完全符合我的要求。谢谢!
  • 如果您的文件很长,您可以通过将键(列[2])和整行保存为元组或字典来避免重新读取文件。
  • @joelgoldstick 在这种情况下,您将错过每个重复条目中的第一次出现
  • 对不起@Sar009,但我应该如何将重复内容存储到文件中而不是打印出来?我无法将多于一行写入一行(或可能覆盖每一行)。提前致谢。 ——
  • @Sar009 非常感谢
【解决方案2】:

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

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

然后循环遍历字典中的每个列表值,如果某个键的值大于1,则出现多次。

【讨论】:

  • 但是我已经用我的代码来做这件事了。我的问题出现在您提到的循环中,因为我不知道如何同时将密钥与其出现的次数联系起来。
【解决方案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

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 2020-11-15
    • 2017-08-07
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多