读取ATCG DNA序列,并计算出第三名ATCG的个数
Reading ATCG DNA sequences, and calculates the numbers of ATCG in third place
我想读ATCG DNA序列,算出第三名ATCG的个数。
例如1:
DNA = AAATTTCCCGGG
第三名ATCG是这样的:AA'A'TT'T'CC'C'GG'G'
所以在这个序列中A=1 T=1 C=1 G=1.
例如2:
DNA = ATGGTATTTAAA
AT"G"GT"A"TT"T"AA"A"
我想数3,6,9,12个地方的ATCG号码。所以在 DNA 中 A=2 T=1 C=0 G=1
我的 txt 文件是这样的:
>seq1
ATGGTATTTAAA
ATCGTTTTTAAA
>seq2
ATGGTATTTAAA
ATCGTTTTTAAA
ATCGTTTTTAAA
>seq3
ATGGTATTTAAA
我的代码是这样的:
f = open("a.txt","r")
seqlist = []
for line in f.readlines():
line = line.strip("\n")
if line.startswith(">"):
print(line)
elif line.startswith("A") or line.startswith("T") or line.startswith("C") or line.startswith("G"):
seq = line
y = 0
for y in range(2, len(seq), 3):
x = seq[y]
print(x)
现在能拿到第三名的ATCG了,想入榜
那我就可以算ATCG了
但我不知道如何将它放在一个列表中。并得到如下结果。
seq1 A=3 T=3 C=1 G=1
seq2 A=? T=? C=? G=?
seq3 A=? T=? C=? G=?
非常感谢您对我的帮助。
这里有一个选项可以尽可能少地修改您的代码:
from collections import Counter
counter = None
for line in f.readlines():
line = line.strip("\n")
if line.startswith(">"):
if counter is not None:
print(counter)
print(line)
counter = Counter()
elif line.startswith("A") or line.startswith("T") or line.startswith("C") or line.startswith("G"):
seq = line
y = 0
for y in range(2, len(seq), 3):
x = seq[y]
counter[x] += 1
print(counter)
输出:
>seq1
Counter({'A': 3, 'T': 3, 'C': 1, 'G': 1})
>seq2
Counter({'T': 5, 'A': 4, 'C': 2, 'G': 1})
>seq3
Counter({'A': 2, 'T': 1, 'G': 1})
同样的事情,但整体上改进了您的代码,并更好地格式化输出:
from collections import Counter
counter = None
bases = 'ATCG'
def print_counter():
print(' '.join('%s=%s' % (k, counter[k]) for k in bases))
with open("a.txt", "r") as f: # Always open files like this
for line in f: # no need for readlines
line = line.strip("\n")
if line.startswith(">"):
if counter is not None:
print_counter()
print(line)
counter = Counter()
elif line and line[0] in bases:
counter.update(line[2::3])
print_counter()
输出:
>seq1
A=3 T=3 C=1 G=1
>seq2
A=4 T=5 C=2 G=1
>seq3
A=2 T=1 C=0 G=1
我想读ATCG DNA序列,算出第三名ATCG的个数。
例如1:
DNA = AAATTTCCCGGG
第三名ATCG是这样的:AA'A'TT'T'CC'C'GG'G'
所以在这个序列中A=1 T=1 C=1 G=1.
例如2:
DNA = ATGGTATTTAAA
AT"G"GT"A"TT"T"AA"A"
我想数3,6,9,12个地方的ATCG号码。所以在 DNA 中 A=2 T=1 C=0 G=1
我的 txt 文件是这样的:
>seq1
ATGGTATTTAAA
ATCGTTTTTAAA
>seq2
ATGGTATTTAAA
ATCGTTTTTAAA
ATCGTTTTTAAA
>seq3
ATGGTATTTAAA
我的代码是这样的:
f = open("a.txt","r")
seqlist = []
for line in f.readlines():
line = line.strip("\n")
if line.startswith(">"):
print(line)
elif line.startswith("A") or line.startswith("T") or line.startswith("C") or line.startswith("G"):
seq = line
y = 0
for y in range(2, len(seq), 3):
x = seq[y]
print(x)
现在能拿到第三名的ATCG了,想入榜
那我就可以算ATCG了
但我不知道如何将它放在一个列表中。并得到如下结果。
seq1 A=3 T=3 C=1 G=1
seq2 A=? T=? C=? G=?
seq3 A=? T=? C=? G=?
非常感谢您对我的帮助。
这里有一个选项可以尽可能少地修改您的代码:
from collections import Counter
counter = None
for line in f.readlines():
line = line.strip("\n")
if line.startswith(">"):
if counter is not None:
print(counter)
print(line)
counter = Counter()
elif line.startswith("A") or line.startswith("T") or line.startswith("C") or line.startswith("G"):
seq = line
y = 0
for y in range(2, len(seq), 3):
x = seq[y]
counter[x] += 1
print(counter)
输出:
>seq1
Counter({'A': 3, 'T': 3, 'C': 1, 'G': 1})
>seq2
Counter({'T': 5, 'A': 4, 'C': 2, 'G': 1})
>seq3
Counter({'A': 2, 'T': 1, 'G': 1})
同样的事情,但整体上改进了您的代码,并更好地格式化输出:
from collections import Counter
counter = None
bases = 'ATCG'
def print_counter():
print(' '.join('%s=%s' % (k, counter[k]) for k in bases))
with open("a.txt", "r") as f: # Always open files like this
for line in f: # no need for readlines
line = line.strip("\n")
if line.startswith(">"):
if counter is not None:
print_counter()
print(line)
counter = Counter()
elif line and line[0] in bases:
counter.update(line[2::3])
print_counter()
输出:
>seq1
A=3 T=3 C=1 G=1
>seq2
A=4 T=5 C=2 G=1
>seq3
A=2 T=1 C=0 G=1