Сравните записи в столбцах из CSV-файлов и извлеките совпадающие - python - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть два CSV-файла (три столбца), которые мне нужно сравнить и извлечь строки из другого файла (пять столбцов), который соответствует.Пример для файлов:

Файл1:

ATGCGCGACAGT, ch3, 123546
ATGCATACAGGATAT, ch2, 5141561615

...... примерно на 100 записей

Файл2:

ATGCGGCGACAGT,ch3, 123456,mi141515, AUCAGCUAUAUAU, UACGCAGAUAUAUA
ATCAGACGATTATGA, ch4, 4564764, mi653453, AUCAGCAAUUUUCG, AUACAGACAAAAA

.... так примерно на 50000 записей

Мне нужно сопоставить столбцы 1,2 и 3 для обоих файлов таким образом, чтобы все три столбца файла1 соответствовали файлу2.Если это произойдет, то извлеките 4,5 и 6 столбцов для дальнейшей обработки.

Я думал о:

fhout=csv.writer(open('parsed_out', 'w'), delimiter=',')

for i in file1:

     a=[0]
     b=[1]
     c=[2]
      for x in file2:
       d=[0]
       e=[1]
       f=[2]
       g=[3]
       h=[4]
       i=[5]
         if a==d and b==e and c==f:
           fhout.writerow([g]+[h]+[i])
         else:
           pass

Но кто-то сказал мне, что я могу использовать хеширование или какой-то другой способ написаниятакие большие циклы для 10000 или более записей в файле1

Пожалуйста, предложите мне лучший способ добиться этого.И файл 1, и файл 2 анализируются из более сложных файлов.

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

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

S = {tuple(line) for line in csv.reader(File1)}

Тогда при чтении второго файла поиск выполняется намного быстрее.

for line in csv.reader(File2):
    key = tuple(line[:3])
    if key in S:
        print(line)
3 голосов
/ 28 февраля 2012

Попробуйте что-то вроде:

import csv

file_1_tuples = []

with open("file_1.csv") as fh:
    csv_reader = csv.reader ( fh )
    for row in csv_reader:
        file_1_tuples.append(  tuple(row)  )

with open("file_2.csv") as fh:
    csv_reader = csv.reader ( fh )
    for row in csv_reader:
        if tuple(row[0:3]) in file_1_tuples:
            print ( row[3:6] )

При запуске со следующими данными:

file_1.csv

person, john, smith
person, anne, frank
person, bob, macdonald
fruit, orange, banana
fruit, strawberry, fields
fruit, ringring, banana

file_2.csv

person, john, smith, 1, 2, 3
person, anne, frank, 4, 5, 6
person, bob, macdonald, 7, 8, 9

выводит

[' 1', ' 2', ' 3']
[' 4', ' 5', ' 6']
[' 7', ' 8', ' 9']

РЕДАКТИРОВАТЬ: Немного более приятная реализация с использованием наборов и списков:

import csv, pprint

with open("file_1.csv") as fh:
    csv_reader = csv.reader ( fh )
    file_1_tuples = { tuple(row) for row in csv_reader }

with open("file_2.csv") as fh:
    csv_reader = csv.reader ( fh )
    matched_rows = [ row for row in csv_reader if (tuple(row[:3]) in file_1_tuples)]

pprint.pprint (matched_rows)

РЕДАКТИРОВАНИЕ 2: Обратите внимание, что эта реализация чувствительна к пробелам в файле CSV.Если интервал в вашем CSV-файле несовместим, используйте что-то вроде row = [element.strip(' ') for element in row], чтобы убрать все пробелы.

2 голосов
/ 28 февраля 2012

Поместите поля из файла 1 в кортеж, а затем добавьте каждый кортеж в набор. Затем вы можете выполнить проверку содержимого первых трех полей в файле 2 на наборе, что намного быстрее, чем ваша гипотетическая реализация.

...