【问题标题】:Python looping through file and generating list from multiple linesPython循环文件并从多行生成列表
【发布时间】:2019-06-27 16:41:41
【问题描述】:

所以我有一个 DNA fasta 文件。其格式如下:(Input Image)

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 TGCGGAGATTTTGGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTA GGTTGAAACAGCCGGGATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAA CTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTG CGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGAATTGCTCACGTGTTT TAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAG GTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTT CCCTCGCAGCCGATACTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGT GCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAG TAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACACTGTACCCCTAGATA TAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCC

最后我想看看这些 Rosalind_id 中哪一个的 DNA 中的 G 和 C 最多。所以我的思考过程是列出 id 标签,然后列出与之相关的所有 dna。然后将它们压缩到字典中,并创建一个函数来确定最高 GC 字母浓度。问题是当我附加多个字母的行时,我得到一个列表,每行由“,”分隔,而不是包含 rosalind_id_tag 下方所有行的 1 个列表,然后用“,”分隔它们,如果它是一个新标签。

所以最终我想要:

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 列表中

到目前为止(有效)我​​的代码是:

file = open("rosalind_gc.txt", "r")


data = file.readlines()

rosalindtags = []

dna = []


for a in data:

    if a.startswith(">"):

        rosalindtags.append(a.rstrip())

    else:

       dna.append(a.rstrip())

dictionary = dict(zip(rosalindtags, dna))

file.close()

我知道我错过了一些微不足道的东西,但我只是不知道它是什么。任何帮助表示赞赏,谢谢!

【问题讨论】:

  • 我不认为这是重复的,因为我相信 OP 可能知道如何连接字符串——只是他忘记或没有意识到他需要解决这个问题 连接字符串。当看到 Rosalind_id 时,需要将作为 DNA 代码的字符串初始化为空字符串。然后,直到下一个 Rosalind_id 或“文件结尾”的后续字符串必须连接在一起并使用最终结果。
  • 现在,rosalindtags 的长度为 2,dna 的长度为 1912。第二个问题是字符串是可迭代的,因此当您将其附加到列表时,字符串的每个字符都会分开元素。
  • 嘿,如果我的回答对你有用,你可以勾选它。谢谢!
  • 如果我的答案对你有用,你可以勾选我的答案吗?

标签: python list file loops


【解决方案1】:

对于更多基于生物信息学的方法,您还可以尝试下载 biopython,它具有直接从 SwissProt 读取 fasta 文件的扩展名。

from Bio import SeqIO, ExPASy

protein_name = "Rosalind_6085"
with ExPASy.get_sprot_raw(protein_cleaned) as handle:
     seq_record = SeqIO.read(handle, "swiss")

proteinseq = seq_record.seq

从这里开始,proteinseq 将是一个字符串,您可以将其与其他字符串进行比较。

【讨论】:

  • 这对你有用还是你需要直接比较文本文件
【解决方案2】:

问题是每个 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()

dictionary 然后是:

{'>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})}

【讨论】:

    【解决方案3】:

    好吧,假设我们从一个文件中读取它并将结果存储在data,这样我们就可以看到我们正在处理的内容:

    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='')
    

    输出将是(由于我用控制台固定,所以行拆分):

    >Rosalind_8728:ATGGAGCCGCACATATAACGGTAAATGCAAAGAAACAGTTCGGGAAAGATATTCAACCAAGGCAACTTCCTGCACTCGTCGCGGGCACGTAGGGAGCCTGACCATCCCTACCCAGACTGTCCCCGATCAGCGAAC
    GGGCCATGCGCTATCAGGTCGATCTAGCACTTGGTAAGTTACGCCAGCTGTACTGAAACAATGCCCGTAGTGACTGAGACGCCAGGGAAAAGGGGATTAAAGCTATGGTAGCCAATCGTCCTAACCTCTAGCCCGCCTGGTATGTAAGAA
    CAAGACATCAGAGATATAGAGGCAGACCGGACCTGCAAGCCGGTCACCTGTGGCTCCCGACAAATGTGGCGTTTAGCTTATGCAAGACCGAAGCTTAGAACCAAGTCGGCTTCGTACCCCTTCTTACCTGTCCACTGCAGTGTTTTGCCT
    GGATCCGGGTGCGCGTGGCACGAGATCTGCTGAGAAGCTATGAACAATCAAATGTGTAGCCCGCTTACGAAGAATCCAGCCCTGAATTCGGGGGCCAGTCTTCGCCGAACTCCCCCTATTGAGTGGTAAAGTGTGTGACTCCTAGTCTTT
    TCACCCGAGTCGTTGAATTGTTAGGCTACAGATTTCGCATAGCCCTGATCCAAGCCTTTCTCTGAAAAGATGCGACCTGCATCACTAAGGCCAACCGTGTGTCTCTCCGACATTACGGCAGTGCCACTGATCGCTCACGAACTTGGGAAG
    CCCCAAAAACTCACATGAGTATGTAGGGCAGTTTTATAGGCTGGGCCCACCCACTTGGTTAGCAAATGGCGCCTGCTCAGAACTCCTTTTACGTAAGTGGTCCCAGTGTGATGGGTCGAGTGAACAAACAAATGTTGACAATTTGCCTCG
    GGGTTA
    
    >Rosalind_6085:CGGATCTGCGTACGGTTGCGTATCCCGTTCAAATGCTCCATCACTCATCACGGAGCCACGTTCCGACCTGCCCACATCTGCGTCTAATACCACGCCAGTACTTACCACGCCGCTGGGTCTTCGAGAACGAGGCTG
    AATGGGTTTCCGGGGGTGGGAAAGTAATACAAGCGTCATTCGTGAACTGGGACCATGTCATCTGGCGAAGCTATAGTGCGATCGAACTAAACGCTAATACGTCGAAACAGTCTATGGCCGTGAACTTTCTCTAGAGGGTAGGGTTCTTAG
    CCCCGCCTATTACTTGAACGGATATCAAAGACAGACTTAGCATCTCTGTACCCGCCCTACTGTTGCTTCAAGTCATGCGGAGATTTGTGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTAGGTTGAAACAGCCGG
    GATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAACTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTGCGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGA
    ATTGCTCACGTGTTTTAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAGGTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTTCCCTCGCAGCCGATA
    CTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGTGCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAGTAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACA
    CTGTACCCCTAGATATAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCCTC
    

    如果您想要实际计数,请在文件开头添加:

    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})
    

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2018-10-04
      • 2022-01-13
      • 2017-11-10
      • 2020-08-07
      相关资源
      最近更新 更多