Написать каждую комбинацию из 2 файлов CSV - PullRequest
0 голосов
/ 07 января 2020

У меня есть 2 CSV-файла с данными о праймерах для ПЦР. Первый файл содержит данные, касающиеся прямых праймеров, а второй - данные для обратных праймеров. Каждый файл имеет 10 строк и около 20 столбцов, и я хотел бы взять каждую строку и создать третью .csv для каждой комбинации при объединении строк из файла 1 и файла 2. Таким образом, файл должен иметь 100 строк и 40 столбцов. поэтому файл должен выглядеть примерно так: 1: forward1, reverse1. строка 2: вперед1, назад2. строка 3: вперед1, назад3. .... строка 41: вперед5, назад1. вплоть до вперед10, назад10

Вот мой код:

with open(forwards) as f_csv:
    read_forward = csv.reader(f_csv)

    with open(reverses) as r_csv:
        read_reverse = csv.reader(r_csv)

        file_name = "Combinations Matrix.csv"
        f = open(file_name, 'w')

        for fwd in read_forward:
            for rev in read_reverse:               
                for f_value in fwd:
                    f.write(f_value + ',')                  
                for r_value in rev:
                  f.write(r_value + ',')              
                f.write('\n')
f.close()
print('done')

Впервые он работает идеально через внешнюю l oop. Другими словами, первый раз через «read_forward» l oop. Но я не могу понять, почему, когда он запускает второй l oop из «read_forward», он не будет записывать комбинации, как это происходит в первый раз. Используя операторы print для консоли, я понял, что он по-прежнему циклически перебирает строки первого файла, но кажется, что он не выполняет внутренний цикл for снова. Может кто-нибудь помочь мне разобраться?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Внутренний читатель CSV исчерпан после первой внешней итерации. Установите read_reverse как:

read_reverse = list(csv.reader(r_csv))
0 голосов
/ 08 января 2020

Не считая ошибки, я думаю, что код можно немного улучшить.

import csv
import itertools as itt

with open('../resources/temp_in.csv', newline='') as f_1, open('../resources/temp_in_2.csv', newline='') as f_2:
    reader_1 = csv.reader(f_1)
    reader_2 = csv.reader(f_2)
    combs = itt.product(reader_1, reader_2)
    rows_gen = (l_1 + l_2 for l_1, l_2 in combs)
    with open('../out/comb_data.csv', 'w', newline='') as out_file:
        writer = csv.writer(out_file)
        writer.writerows(rows_gen)

Содержимое 'temp_in.csv':

a,1
b,2
c,3
d,4
e,5

Содержимое 'temp_in_2.csv':

hello,bye
kfa,dko
jfo,pkfe
oajwi,nindwa
idja,iojn

Содержимое 'comb_data.csv' после исполнения:

a,1,hello,bye
a,1,kfa,dko
a,1,jfo,pkfe
a,1,oajwi,nindwa
a,1,idja,iojn
b,2,hello,bye
b,2,kfa,dko
b,2,jfo,pkfe
b,2,oajwi,nindwa
b,2,idja,iojn
c,3,hello,bye
c,3,kfa,dko
c,3,jfo,pkfe
c,3,oajwi,nindwa
c,3,idja,iojn
d,4,hello,bye
d,4,kfa,dko
d,4,jfo,pkfe
d,4,oajwi,nindwa
d,4,idja,iojn
e,5,hello,bye
e,5,kfa,dko
e,5,jfo,pkfe
e,5,oajwi,nindwa
e,5,idja,iojn
...