**是Python的新功能,对不起**
我正在尝试获取给定的示例文件,并使用函数仅将包含“ A”或“ T”或“ G”或“ C”(DNA链)的行添加到列表中。
示例文件:
gene1
ATGATGATGGCG
基因2
GGCATATC
CGGATACC
基因3
TAGCTAGCCCGC
在gene2下,需要使用我的函数来连接两行。
这是我完成的功能:
def create(filename):
"""
Purpose: Creates and returns a data structure (list) to store data.
:param filename: The given file
Post-conditions: (none)
:return: List of data.
"""
new_list = []
f = open(filename, 'r')
for i in f:
if not('A' or 'T' or 'G' or 'C') in i:
new_list = new_list #Added this so nothing happens but loop cont.
else:
new_list.append(i.strip())
f.close()
return new_list
我需要以某种方式找到文件中包含两行连续DNA(“ GTCA”)的部分,然后将它们加入到列表中。
如果操作正确,则打印时的输出应为:
['ATGATGATGGCG', 'GGCATATCCGGATACC', 'TAGCTAGCCCGC']
谢谢!
答案 0 :(得分:1)
您可以使用set
来检查某行是否为DNA线,即仅由ACGT字母组成:
with open(filename) as f:
new_list = []
concat = False
for line in f:
if set(line.strip()) == {'A', 'C', 'G', 'T'}:
if concat:
new_list[-1] += line.strip()
else:
new_list.append(line.strip())
concat = True
else:
concat = False
# ['ATGATGATGGCG', 'GGCATATCCGGATACC', 'TAGCTAGCCCGC']
答案 1 :(得分:1)
抢险救援!
<div *ngFor="let item of category">
<div *ngFor="let subItem of item.categories">
{{subItem.categories.id}}
</div>
</div>
需要特别注意的是,如果import re
def create(filename):
dna_regex = re.compile(r'[ATGC]+')
with open(filename, 'r') as f:
return dna_regex.findall(f.read().replace('\n', '')))
new_list = []
new_list += create("gene_file.txt")
行包含A,T,G或C,则此实现尤其可能会产生误报。
它的作用是将整个文件放入,删除换行符,然后查找仅包含A,T,G或C的所有序列,并返回它们。
答案 2 :(得分:0)
如果我们可以假设每个DNA部分都以一行作为前缀,则可以利用takewhile
函数来对DNA行进行分组:
from itertools import takewhile
DNA_CHARS = ('A', 'T', 'G', 'C')
lines = ['gene1', 'ATGATGATGGCG', 'gene2', 'GGCATATC', 'CGGATACC', 'gene3', 'TAGCTAGCCCGC']
input_lines = iter(lines[1:])
dna_lines = []
while True:
dna_line = ''.join(takewhile(lambda l: any(dna_char in l for dna_char in DNA_CHARS),
input_lines))
if not dna_line:
break
dna_lines.append(dna_line)