机智以文件结束

Wit's end with file to dict

Python:2.7.9 我擦掉了我所有的代码,因为我快疯了。 这是要点(这是给 Rosalind 的挑战):

我想要一个看起来像这样的文件(插入符号上没有引号)

">"Rosalind_0304
actgatcgtcgctgtactcg
actcgactacgtagctacgtacgctgcatagt

">"Rosalind_2480
gctatcggtactgcgctgctacgtg
ccccccgaagaatagatag

">"Rosalind_2452
cgtacgatctagc
aaattcgcctcgaactcg 等...

我想不通的是,到这里基本上什么都想不通了,脑子里乱七八糟的。我只会展示我在做什么,但没能做到。

第一。我想在文件中搜索“>” 然后将该行的其余部分作为键分配到字典中。 阅读下一行直到下一个'>'并做一些计算和return 对该键值的调查结果。 遍历文件并对每个字符串执行此操作。

然后比较所有值和 return 哪个值最高的键。 谁能帮忙? 如果我休息一下可能会有所帮助。我整天都在编码,我想我闻到了颜色。

    def func(dna_str):
        bla
        return gcp #gc count percentage returned to the value in dict

my_function某处returns那个百分比值:

with open('rosalind.txt', 'r') as ros:
    rosa = {line[1:].split(' ')[0]:my_function(line.split(' ')[1].strip()) for line in ros if line.strip()}
top_key = max(rosa, key=rosa.get)
print(top_key, rosa.get(top_key))

对于文件中的每一行,这将首先检查在去除尾随白色后该行是否还剩下任何内容space,然后丢弃空白行。接下来,它将每个非空行作为条目添加到字典中,键是 space 左侧的所有内容,不需要的 > 除外,值是发送所有内容的结果在函数 space 的右侧。

然后它保存对应于最高值的键,然后打印该键及其对应的值。您剩下一本字典 rosa,您可以随意处理它。


模块完整代码:

def my_function(dna):
    return 100 * len(dna.replace('A','').replace('T',''))/len(dna)

with open('rosalind.txt', 'r') as ros:
    with open('rosalind_clean.txt', 'w') as output:
        for line in ros:
            if line.startswith('>'):
                output.write('\n'+line.strip())
            elif line.strip():
                output.write(line.strip())

with open('rosalind_clean.txt', 'r') as ros:
    rosa = {line[1:].split(' ')[0]:my_function(line.split(' ')[1].strip()) for line in ros if line.strip()}
top_key = max(rosa, key=rosa.get)
print(top_key, rosa.get(top_key))

rosalind.txt的完整内容:

>Rosalind_6404 CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCG
TTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG
>Rosalind_5959 CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCA
GGCGCTCCGCCGAAGGTCTATATCCA
TTTGTCAGCAGACACGC
>Rosalind_0808 CCACCCTCGTGGT

ATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT

当 运行 模块时的结果:

Rosalind_0808 60.91954022988506

这应该可以正确处理不一定每行有一个条目的输入文件。


请参阅 SO 的格式化指南,了解如何制作内联或块代码标记以避开 ">" 之类的内容。如果您希望它显示为常规文本而不是代码,请使用反斜杠转义 >

类型:

\>Rosalind

结果:

>罗莎琳德

我想我现在已经把那部分记下来了。非常感谢。 BUUUUT。它会引发错误。

        rosa = {line[1:].split(' ')[0]:calc(line.split(' ')[1].strip()) for line in ros if line.strip()}

IndexError: 列表索引超出范围

顺便说一句,这是我的功能。

def calc(dna_str):

    for x in dna_str:
        if x == 'G':
            gc += 1
            divc += 1
        elif x == 'C':
            gc += 1
            divc += 1
        else:
            divc += 1

    gcp = float(gc/divc)

return gcp

准确的测试文件。前后无空行。
>Rosalind_6404 CCTGCGGAAGATCGGCACTAGAATGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC TCCCACTAATATTCTGAGG
>Rosalind_5959 CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT ATATCCATTTGTCAGCAGACACGC
>Rosalind_0808 CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC公司 TGGGAACCTGCGGGCAGTAGGTGGAAT