我是一名生物工程博士生,试图自学 Python 编程以用于自动化我的部分研究,但我遇到了处理更大列表中的子列表的问题,我似乎无法解决。
基本上,我要做的目标是编写一个小脚本,该脚本将处理一个 CSV 文件,其中包含我正在使用各种 DNA 组装方法构建的质粒序列列表,然后吐出我需要的引物序列订购以构建质粒。
这是我正在处理的场景:
当我想构建一个质粒时,我必须在我的 Excel 电子表格中输入该质粒的完整序列。我必须在称为“Gibson”和“iPCR”的两种 DNA 组装方法之间进行选择。每个“iPCR”组装只需要列表中的一行,所以我已经知道如何处理这些人,因为我只需将我正在尝试构建的质粒的完整序列放入一个单元格中。另一方面,“Gibson”组装要求我必须将完整的 DNA 序列分成更小的块,所以有时我需要 Excel 电子表格中的 2-5 行来完整描述一个质粒。
所以我最终得到了一个看起来像这样的电子表格:
构造......策略......名称
1.....Gibson.....P(OmpC)-cI::P(cI)-LacZ 控制器
1.....Gibson.....P(OmpC)-cI::P(cI )-LacZ 控制器
1......Gibson......P(OmpC)-cI::P(cI)-LacZ 控制器
2......iPCR.......P(cpcG2)-带 K1F 位置的 K1F 控制器。反馈
3 .....Gibson .....P(cpcG2)-K1F 控制器与交换启动子位置
3 .....Gibson .....P(cpcG2)-K1F 控制器与交换启动子位置
4.. ...iPCR.......P(cpcG2)-K1F 控制器,具有更强的 K1F RBS 库
我认为这个长度的列表具有足够的代表性。
所以我遇到的问题是,我希望能够遍历列表并处理吉布森,但我似乎无法让代码以我想要的方式工作。这是我到目前为止编写的代码:
#import BioPython Tools
from Bio.Seq import Seq
from Bio.Alphabet import IUPAC
#import csv tools
import csv
import sys
import os
with open('constructs-to-make.csv', 'rU') as constructs:
construct_list = csv.reader(constructs, delimiter=',')
construct_list.next()
construct_number = 1
primer_list = []
temp_list = []
counter = 2
for row in construct_list:
print('Current row is row number ' + str(counter))
print('Current construct number is ' + str(construct_number))
print('Current assembly type is ' + row[1])
if row[1] == "Gibson": #here, we process the Gibson assemblies first
print('Current construct number is: #' + row[0] + ' on row ' + str(counter) + ', which is a Gibson assembly')
## print(int(row[0]))
## print(row[3])
if int(row[0]) == construct_number:
print('Adding DNA sequence from row ' + str(counter) + ' for construct number ' + row[0])
temp_list.append(str(row[3]))
counter += 1
if int(row[0]) > construct_number:
print('Current construct number is ' + str(row[0]) + ', which is greater than the current construct number, ' + str(construct_number))
print('Therefore, going to work on construct number ' + str(construct_number))
for part in temp_list: #process the primer design work here
print('test')
## print(part)
construct_number += 1
temp_list = []
print('Adding DNA from row #' + str(counter) + ' from construct number ' + str(construct_number))
temp_list.append(row)
print('Next construct number is number ' + str(construct_number))
counter += 1
## counter += 1
if str(row[1]) == "iPCR":
print('Current construct number is: ' + row[0] + ' on row ' + str(counter) + ', which is an iPCR assembly.')
#process the primer design work here
#get first 60 nucleotides from the sequence
sequence = row[3]
fw_primer = sequence[1:61]
print('Sequence of forward primer:')
print(fw_primer)
last_sixty = sequence[-60:]
## print(last_sixty)
re_primer = Seq(last_sixty).reverse_complement()
print('Sequence of reverse primer:')
print(re_primer)
#ending code: add 1 to counter and construct number
counter += 1
construct_number += 1
## if int(row[0]) == construct_number:
## else:
## counter += 1
## construct_number += 1
## print(temp_list)
## for row in temp_list:
## print(temp_list)
## print(temp_list[-1])
# fw_primer = temp_list[counter - 1].
(我知道代码可能看起来很菜鸟 - 除了介绍性 Java,我从未做过任何编程课程。)
这段代码的问题在于,如果我有 n 个试图通过“Gibson”组装构建的“构造”(又名质粒),它将处理前 n-1 个质粒,但不会处理最后一个。然而,我也想不出任何更好的方法来编写这段代码,但我可以看到,对于我试图实现的工作流程,知道如何处理列表中的“n”个事物,但每个“事物“可变数量的行,对我来说真的很方便。
我真的很感谢这里的任何人的帮助!非常感谢!