2015-09-28 2 views
4

Я пытаюсь создать цикл, который ищет через файл csv для строк с общим третьим и четвертым столбцами и выполняет над ними операцию.
файл я должен выглядеть следующим образом:Поиск файла csv для определенных элементов в столбцах

name1,x,y,z,notes 
name2,a,b,c,notes 
name3,a,y,z,notes 

Я использую код, который считывает первую строку и идентифицирует строку [2] и ряд [3] и выполняет поиск всех строк в файле для этой комбинации колонны. К сожалению, я не могу понять, как их искать.

for row in csvfile: 
    row_identify = row[2:3] 
    for row in csvfile: 
     if row_identify in row: 
      print row 
     else: 
      print "not here" 

Я хочу, чтобы он печатал первую и третью строки (так как y и z были бы row_identify). Я предположил, что могу просто указать, что я хотел искать эти строки, но это, похоже, не работает. Я также пробовал использовать

row_identify = str(row[2]),str(row[3]) 

но это тоже не работает.

+0

Что именно вы пытаетесь сделать? И насколько велика эта csvfile? –

ответ

3

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

>>> import collections 
>>> similarities = collections.defaultdict(list) 

>>> for row in csvfile: 
...  similarities[(row[2], row[3])].append(row) 

>>> print similarities 
{('y', 'z'): [['name1', 'x', 'y', 'z', 'notes'], 
       ['name3', 'a', 'y', 'z', 'notes']], 
('b', 'c'): [['name2', 'a', 'b', 'c', 'notes']] 
} 
-1

Если вы хотите, чтобы определить строки с тем же 3-ем и 4-й колонну в качестве первый ряд:

import csv 
import operator 

key = operator.itemgetter(2,3) 
with open('path/to/input') as infile: 
    rows = csv.reader(infile) 
    holyGrail = key(next(rows)) 
    for row in rows: 
     if key(row) != holyGrail: 
      continue 
     do_stuff(row) 

Если вы хотите более обобщенную версию, кластеризация всех строк, которые разделяют подобный 3-й и 4-й столбец, а затем:

import csv 
import operator 
from collections import defaultdict as dd 

key = operator.itemgetter(2,3) 
info = operator.itemgetter(0,1) 
similarities = dd(list) 
with open('path/to/input') as infile: 
    for i,row in enumerate(csv.reader(infile)): 
     similarities[key(row)].append((i,info(row))) 

for k, rows in similarities.items(): 
    print("These following rows all have the id <{}> (the data follows):".format(k), ', '.join([str(i) for i,_ in rows])) 
    print('\n'.join(['\t' + '\t'.join([row]) for _,row in rows]) 
+0

Почему downvote? – inspectorG4dget

Смежные вопросы