【问题标题】:Write every combination from 2 CSV files从 2 个 CSV 文件中写入每个组合
【发布时间】:2020-01-07 20:37:29
【问题描述】:

我有 2 个 csv 文件,其中包含有关 PCR 引物的数据。第一个文件包含有关正向引物的数据,第二个是反向引物的数据。每个文件有 10 行和大约 20 列,当组合来自文件 1 和文件 2 的行时,我想使用每一行并使用每个组合制作第三个 .csv。所以文件应该是 100 行和 40 列。 所以文件应该看起来像这样 第 1 行:正向 1,反向 1。 第 2 行:正向 1,反向 2。 第 3 行:正向 1,反向 3。 …… 第 41 行:forward5,reverse1。 一路向前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')

这是第一次通过外循环完美运行。也就是说,第一次通过“read_forward”循环。但我不明白为什么当它开始“read_forward”的第二个循环时,它不会像第一次那样写入组合。使用控制台的打印语句,我发现它仍在循环第一个文件的行,但似乎它没有再次执行内部 for 循环。有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

  • 你能为一个可运行的、有代表性的例子提供足够的数据吗?请参阅:minimal reproducible example
  • 我忘了补充一点,分享更多你的程序也应该很有用。

标签: python csv for-loop combinations


【解决方案1】:

内部 CSV 读取器在第一次外部迭代后耗尽。设置read_reverse为:

read_reverse = list(csv.reader(r_csv))

【讨论】:

  • 另外,可以使用itertools.product代替嵌套的for循环
  • 解决了!我知道这是我缺少的一些东西。非常感谢!!
【解决方案2】:

除了Bug,我觉得代码可以改进一点。

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

【讨论】:

  • 你是对的。我认为这是一种改进。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2010-10-24
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2017-10-19
相关资源
最近更新 更多