Python在文件中循环并从多行生成列表
所以我有一份DNA档案。其格式如下:() 罗莎琳德8728 ATGGAGCGCATAACGGTAAATGCAAAGAAACAGTCGGGAAAGATTCAACACA GGCAACTTCTCTGCGCGTCGCGGGCACGTGAGGGAGAGGCTGACTCCTCCAGACTGT CCCCGATCAGCGAACGGGCCATGCGCCTATCAGGTCAGTCAGTCATGCACTTGGTAAGTTACCC AGCTGCTACTGAACAATCCCGTAGTGATGAGCCAGGAAGGAAGGATAAGCTA TGGTAGCCAATCGTCCTAACCTCTAGCCGCCTGGTATGTAAGAGACAAGACATCAGAGAGAGAGAGAGACATCAGAGAT 阿塔加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加加 GCTTATGCAGAGACGCTTAGAGACAGTCGGCTTCGTACCCCTTCTTACCTGTCAC TGCAGTGTTTTTGCCTGGATCCGGGTGCGTGGCACGAGATCTGCTGAGAGAGATGAGCTATCGAAC AATCAATGTGTAGCCGCTTACCAGAATCCAGCCCTGATTCGGGGCCAGTCTCGC CGAACTCCCCCTATTGGAGTAAAGTGTGTGTGCTGCTAGTTCTTCACCGAGTTG AATTGTTAGGCTACAGATTCGCATAGCCTGATCCAAGCCTTTCTCTGAAAGAATGCGA CCTGCATCACTAGGCACCGTGTCTCCGACATACGGCAGTGCCACTCCATCGCT CACGAACTTGGGAAGCCCAAACTCACATGAGTAGGCAGTTTTATAGGCTGGG CCCACCATTGGTTAGCAATGCGCCTGCTCAGAACTCTCTCTTATAGTAAGTGGTCCCA GTGTGATGGGGTCGAGTGAACAAAATGTTGAATTTGCCTCGGGGTTA 罗莎琳德·欧6085 CGGATCTCGCGTACGGTTGCGTATCCCGTTCAATGCTCCATCACGCGAGCACCG TTCCGACCTGCCCACTGCGTCTACACGCGCGTACTTACCACGCCGCTGGGTCT TCGAGAAGAGGCGAATGGTTTCGGGGGTGGGAAGTAATACAGCGGTCATTCGGTGA ACTGGGACCATGTCATCTGGCGAGCTATTAGTGCGATCGAACTAACGCTAACGCTATCGTCGA AACAGTTAGGCCGTGACTTTCTCTAGGGTAGGTTCTAGCCGCCTATTACTT GAACGGATCAAGACAGACTTAGCATCTGTACCCGCCCTGTTGCTCAGCATAGTCA TGCGGAGATTTGGGAGCTGGTCACCCATCGGGCATCACAGAGATTGGTCTCTCGTA GGTTGAACAGCGGGATGCACGTGTTTTGTAGGCAATATATAGTTTCGGTGCTAA CTAGATTGAGCACTCCATGCAGAGCATAGATAGAGAGACGAATGTTTATATATGTG CGTTTACCGATCAGATGCAGTACTTTGGTGGGCAATTTATGTGAATGCTCAGTGTTT TAATAACCGGTCCAGGTTACTCCGCCAGTCATAGAATGGGAGTATAGAGAG GTAGCTTTCTTTCCACTTGCTTCGAAGTGGCCCTCCATGGCCATCCAGATCCATCCATCACTT CCCTCGCAGCATACTTTAATCTGTTCTCGACTGGTTATACGTTTTGAGGCGAGATTGT GCAGGTATCGTCGAGTTAGGAGAACCGTGGCTGTCTCAAACCGGTAGGCGAAG TAACTTGTGGTGGCGTACCCTTTTCTCGCAGACACACATGTTACCCTAGATA TAGTGAATCAGTGAATCAAGATCATCGCGGAATAGACACTCGCTTGAGAACAATTCC 最后,我想看看这些罗莎琳的DNA中哪一个的G和C最多。所以我的思维过程是列出id标签,然后列出与之相关的所有dna。然后将它们压缩到字典中,并创建一个函数来确定最高GC字母浓度。问题是,当我附加多个字母的行时,我会得到一个列表,每行用“,”分隔,而不是一个列表,其中包含rosalind_id_标记下面的所有行,如果是新标记,则用“,”分隔 因此,我最终想要:Python在文件中循环并从多行生成列表,python,list,file,loops,Python,List,File,Loops,所以我有一份DNA档案。其格式如下:() 罗莎琳德8728 ATGGAGCGCATAACGGTAAATGCAAAGAAACAGTCGGGAAAGATTCAACACA GGCAACTTCTCTGCGCGTCGCGGGCACGTGAGGGAGAGGCTGACTCCTCCAGACTGT CCCCGATCAGCGAACGGGCCATGCGCCTATCAGGTCAGTCAGTCATGCACTTGGTAAGTTACCC AGCTGCTACTGAACAATCCCGTAGTGATGAGCCAGGAAGGAAGG
dna = [list of letters from first random_id, list of letters from second_random_id, ...]
而不是我得到的是:
dna = [this is first line, this is second line, this is third line,..]
我试过扩展,但似乎不起作用
我试着制作嵌套列表,并将它们附加到我的主DNA列表中
到目前为止,我的代码是:
我知道我遗漏了一些琐碎的东西,但我只是不知道它是什么。感谢您的帮助,谢谢 问题是每个ID有一行,但是有多行DNA。 创建
rosalindtag
时,可以将空字符串附加到dna
。当您遇到一条DNA线时,您可以将其添加到DNA的最后一个元素中:
file = open("rosalind_gc.txt", "r")
data = file.readlines()
rosalindtags = []
dna = []
for a in data:
if a.startswith(">"):
rosalindtags.append(a.rstrip())
dna.append('')
else:
dna[-1] = dna[-1] + a.rstrip()
dictionary = dict(zip(rosalindtags, dna))
file.close()
字典
是:
{'>Rosalind_8728': 'ATGGAGCCGCACATATAACGGTAAATGCAAAGAAACAGTTCGGGAAAGATATTCAACCAAGGCAACTTCCTGCACTCGTCGCGGGCACGTAGGGAGCCTGACCATCCCTACCCAGACTGTCCCCGATCAGCGAACGGGCCATGCGCTATCAGGTCGATCTAGCACTTGGTAAGTTACGCCAGCTGTACTGAAACAATGCCCGTAGTGACTGAGACGCCAGGGAAAAGGGGATTAAAGCTATGGTAGCCAATCGTCCTAACCTCTAGCCCGCCTGGTATGTAAGAACAAGACATCAGAGATATAGAGGCAGACCGGACCTGCAAGCCGGTCACCTGTGGCTCCCGACAAATGTGGCGTTTAGCTTATGCAAGACCGAAGCTTAGAACCAAGTCGGCTTCGTACCCCTTCTTACCTGTCCACTGCAGTGTTTTGCCTGGATCCGGGTGCGCGTGGCACGAGATCTGCTGAGAAGCTATGAACAATCAAATGTGTAGCCCGCTTACGAAGAATCCAGCCCTGAATTCGGGGGCCAGTCTTCGCCGAACTCCCCCTATTGAGTGGTAAAGTGTGTGACTCCTAGTCTTTTCACCCGAGTCGTTGAATTGTTAGGCTACAGATTTCGCATAGCCCTGATCCAAGCCTTTCTCTGAAAAGATGCGACCTGCATCACTAAGGCCAACCGTGTGTCTCTCCGACATTACGGCAGTGCCACTGATCGCTCACGAACTTGGGAAGCCCCAAAAACTCACATGAGTATGTAGGGCAGTTTTATAGGCTGGGCCCACCCACTTGGTTAGCAAATGGCGCCTGCTCAGAACTCCTTTTACGTAAGTGGTCCCAGTGTGATGGGTCGAGTGAACAAACAAATGTTGACAATTTGCCTCGGGGTTA',
'>Rosalind_6085': 'CGGATCTGCGTACGGTTGCGTATCCCGTTCAAATGCTCCATCACTCATCACGGAGCCACGTTCCGACCTGCCCACATCTGCGTCTAATACCACGCCAGTACTTACCACGCCGCTGGGTCTTCGAGAACGAGGCTGAATGGGTTTCCGGGGGTGGGAAAGTAATACAAGCGTCATTCGTGAACTGGGACCATGTCATCTGGCGAAGCTATAGTGCGATCGAACTAAACGCTAATACGTCGAAACAGTCTATGGCCGTGAACTTTCTCTAGAGGGTAGGGTTCTTAGCCCCGCCTATTACTTGAACGGATATCAAAGACAGACTTAGCATCTCTGTACCCGCCCTACTGTTGCTTCAAGTCATGCGGAGATTTGTGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTAGGTTGAAACAGCCGGGATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAACTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTGCGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGAATTGCTCACGTGTTTTAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAGGTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTTCCCTCGCAGCCGATACTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGTGCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAGTAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACACTGTACCCCTAGATATAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCCTC'}
请注意,如果读取大文件,这种方法将需要大量内存
这里有一种替代方法,它逐行读取文件,只在内存中保留字母计数:
from collections import Counter
rosalin_id = None
dna = {}
with open("rosalind_gc.txt") as rosalin_f:
for line in rosalin_f:
if line.startswith(">"):
rosalin_id = line.rstrip()
dna[rosalin_id] = Counter()
else:
dna[rosalin_id] += Counter(line.rstrip())
dna
它返回:
{'>Rosalind_8728': Counter({'A': 228, 'T': 202, 'G': 225, 'C': 236}),
'>Rosalind_6085': Counter({'C': 236, 'G': 237, 'A': 231, 'T': 258})}
对于更基于生物信息学的方法,您也可以尝试下载biopython,它具有直接从SwissProt读取fasta文件的扩展名
来自生物导入SeqIO,ExPASy
protein_name=“Rosalind_6085”
使用ExPASy.get_sprot_raw(蛋白质_cleaned)作为手柄:
seq_记录=SeqIO.read(句柄,“瑞士”)
proteinseq=seq_record.seq
从这里开始,proteinseq将是一个可以与其他字符串进行比较的字符串 好吧,让我们假设我们从一个文件中读取它,并将结果存储在数据中,这样我们就可以看到我们正在处理什么:
data = """>Rosalind_8728
ATGGAGCCGCACATATAACGGTAAATGCAAAGAAACAGTTCGGGAAAGATATTCAACCAA
GGCAACTTCCTGCACTCGTCGCGGGCACGTAGGGAGCCTGACCATCCCTACCCAGACTGT
CCCCGATCAGCGAACGGGCCATGCGCTATCAGGTCGATCTAGCACTTGGTAAGTTACGCC
AGCTGTACTGAAACAATGCCCGTAGTGACTGAGACGCCAGGGAAAAGGGGATTAAAGCTA
TGGTAGCCAATCGTCCTAACCTCTAGCCCGCCTGGTATGTAAGAACAAGACATCAGAGAT
ATAGAGGCAGACCGGACCTGCAAGCCGGTCACCTGTGGCTCCCGACAAATGTGGCGTTTA
GCTTATGCAAGACCGAAGCTTAGAACCAAGTCGGCTTCGTACCCCTTCTTACCTGTCCAC
TGCAGTGTTTTGCCTGGATCCGGGTGCGCGTGGCACGAGATCTGCTGAGAAGCTATGAAC
AATCAAATGTGTAGCCCGCTTACGAAGAATCCAGCCCTGAATTCGGGGGCCAGTCTTCGC
CGAACTCCCCCTATTGAGTGGTAAAGTGTGTGACTCCTAGTCTTTTCACCCGAGTCGTTG
AATTGTTAGGCTACAGATTTCGCATAGCCCTGATCCAAGCCTTTCTCTGAAAAGATGCGA
CCTGCATCACTAAGGCCAACCGTGTGTCTCTCCGACATTACGGCAGTGCCACTGATCGCT
CACGAACTTGGGAAGCCCCAAAAACTCACATGAGTATGTAGGGCAGTTTTATAGGCTGGG
CCCACCCACTTGGTTAGCAAATGGCGCCTGCTCAGAACTCCTTTTACGTAAGTGGTCCCA
GTGTGATGGGTCGAGTGAACAAACAAATGTTGACAATTTGCCTCGGGGTTA
>Rosalind_6085
CGGATCTGCGTACGGTTGCGTATCCCGTTCAAATGCTCCATCACTCATCACGGAGCCACG
TTCCGACCTGCCCACATCTGCGTCTAATACCACGCCAGTACTTACCACGCCGCTGGGTCT
TCGAGAACGAGGCTGAATGGGTTTCCGGGGGTGGGAAAGTAATACAAGCGTCATTCGTGA
ACTGGGACCATGTCATCTGGCGAAGCTATAGTGCGATCGAACTAAACGCTAATACGTCGA
AACAGTCTATGGCCGTGAACTTTCTCTAGAGGGTAGGGTTCTTAGCCCCGCCTATTACTT
GAACGGATATCAAAGACAGACTTAGCATCTCTGTACCCGCCCTACTGTTGCTTCAAGTCA
TGCGGAGATTTGTGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTA
GGTTGAAACAGCCGGGATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAA
CTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTG
CGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGAATTGCTCACGTGTTT
TAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAG
GTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTT
CCCTCGCAGCCGATACTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGT
GCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAG
TAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACACTGTACCCCTAGATA
TAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCC
TC"""
lines = data.splitlines(False)
d = {}
n = len(lines)
i = 0
while i < n:
line = lines[i]
if line[0] == ">":
id = line
i += 1
dna = ''
while i < n:
line = lines[i]
if line[0] != '>':
dna += line
i += 1
else:
break
d[id] = dna
else:
# unexpected, so skip until you find a tag
i += 1
for k, v in d.items():
print(k, ':', v, "\n", sep='')
如果需要实际计数,请在文件开头添加:
from collections import Counter
并将d[id]=dna
替换为d[id]=Counter(dna)
。然后你会得到:
>Rosalind_8728:Counter({'C': 236, 'A': 228, 'G': 225, 'T': 202})
>Rosalind_6085:Counter({'T': 258, 'G': 237, 'C': 236, 'A': 231})
我不认为这是重复的,因为我相信OP可能知道如何连接字符串——只是他忘记或没有意识到,对于这个问题,他需要连接字符串。当看到Rosalind_id时,需要将作为DNA代码的字符串初始化为空字符串。然后,必须将下一个Rosalind_id或“文件结尾”之前的后续字符串连接在一起,并使用最终结果。现在,rosalindtags
的长度为2,dna
的长度为1912。第二个问题是字符串是可编辑的,所以当你把它附加到一个列表中时,字符串的每一个元素都变成了单独的元素。谢谢你能勾选我的答案吗?这对你有用吗?还是你需要直接比较文本文件
from collections import Counter
>Rosalind_8728:Counter({'C': 236, 'A': 228, 'G': 225, 'T': 202})
>Rosalind_6085:Counter({'T': 258, 'G': 237, 'C': 236, 'A': 231})