Python - отображать строки с повторяющимися значениями в файлах csv

У меня есть 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 a repeated number:
 print rows containing those number
else
 print "No repetitions"

Заранее спасибо.

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"


Вы должны создать свой словарь следующим образом, чтобы дубликаты записей не перезаписывались друг другом:

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

Затем пропустите каждое значение списка в словаре, если значение для определенного ключа больше 1, то оно появляется более одного раза.


Пусть просто дважды прокрутите файл:

  • сначала отслеживайте, сколько раз появляется каждая третья колонка.
  • второй цикл через строки, которые печатают те, которые содержат третий столбец, которые появляются более одного раза.

Видеть:

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

licensed under cc by-sa 3.0 with attribution.