Python 以字符串而不是单个字母的形式从文件中读取序列

Python 以字符串而不是单个字母的形式从文件中读取序列,python,list,loops,Python,List,Loops,我有三个文件,它们看起来像这样: >xx_oneFish |xxx AAAAAAA >xx_twoFish |xxx CCCCCC >xx_redFish |xxx TTTTTT >xx_blueFish |xxx GGGGGG 我尝试使用python读取这些文件以获得以下结果: [[ 'aaaa', 'cccc'], ['tt', 'gg'], [ 'AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']] [[], 'aaaa', 'ccc

我有三个文件,它们看起来像这样:

>xx_oneFish |xxx
AAAAAAA
>xx_twoFish |xxx
CCCCCC
>xx_redFish |xxx
TTTTTT
>xx_blueFish |xxx
GGGGGG
我尝试使用python读取这些文件以获得以下结果:

[[ 'aaaa', 'cccc'], ['tt', 'gg'], [ 'AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']]
[[], 'aaaa', 'cccc', [], 'tt', 'gg', [], 'AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']
[['a', 'a', 'a', 'a', 'c', 'c', 'c', 'c'], ['t', 't', 'g', 'g'], ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'T', 'T', 'T', 'T', 'T', 'T', 'G', 'G', 'G', 'G', 'G', 'G']]
这是我的密码:

testNames = []
testSequences = []
counter = 0
for filename in os.listdir("/PATH/TO/FILE"): #go to directory where aligned files are kept
    if filename.endswith(".txt"): #open files which have been aligned with MAFFT
        fastaFile = open(filename, 'r') 
        testNames.append([])
        testSequences.append([])
        for line in fastaFile: 
            line = line.strip() 
            if len(line)>0: 
                if line[0] == '>':  
                    testNames[counter].append(line[1:]) 
                    testSequences.append("") 
                    currentTaxon = len(testSequences)-1 
                else: 
                    testSequences[currentTaxon] += line 
        counter +=1

print testSequences
这给了我一个结果:

[[ 'aaaa', 'cccc'], ['tt', 'gg'], [ 'AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']]
[[], 'aaaa', 'cccc', [], 'tt', 'gg', [], 'AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']
[['a', 'a', 'a', 'a', 'c', 'c', 'c', 'c'], ['t', 't', 'g', 'g'], ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'T', 'T', 'T', 'T', 'T', 'T', 'G', 'G', 'G', 'G', 'G', 'G']]
我试图将代码改为,但括号内的字符串去掉了第14行:

testNames = []
testSequences = []
counter = 0
for filename in os.listdir("/PATH/TO/FILE"): #go to directory where aligned files are kept
    if filename.endswith(".txt"): #open files which have been aligned with MAFFT
        fastaFile = open(filename, 'r') 
        testNames.append([])
        testSequences.append([])
        for line in fastaFile: 
            line = line.strip() 
            if len(line)>0: 
                if line[0] == '>':  
                    testNames[counter].append(line[1:]) 
                    currentTaxon = len(testSequences)-1 
                else: 
                    testSequences[currentTaxon] += line 
        counter +=1

print testSequences
现在我得到这个结果:

[[ 'aaaa', 'cccc'], ['tt', 'gg'], [ 'AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']]
[[], 'aaaa', 'cccc', [], 'tt', 'gg', [], 'AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG']
[['a', 'a', 'a', 'a', 'c', 'c', 'c', 'c'], ['t', 't', 'g', 'g'], ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'T', 'T', 'T', 'T', 'T', 'T', 'G', 'G', 'G', 'G', 'G', 'G']]
如何修复代码以使序列作为字符串读入嵌套列表中

我希望保持列表TestName的内容不变:

[['xx_oneFish |xxx', 'xx_twoFish |xxx'], ['xx_redFish |xxx', 'xx_blueFish |xxx'], ['xx_oneFish |xxx', 'xx_twoFish |xxx', 'xx_redFish |xxx', 'xx_blueFish |xxx']]
试试这个:

import os
testSequences = []
testNames = []
for filename in os.listdir("./"): #go to directory where aligned files are kept
    if filename.endswith(".txt"): #open files which have been aligned with MAFFT
        fastaFile = open(filename, 'r') 
        temp_sub_list_names = []
        temp_sub_list_seq = []
        for line in fastaFile:
            line = line.strip()
            if line:
                if not line.startswith('>'):
                    temp_sub_list_seq.append(line)
                else:
                    temp_sub_list_names.append(line)
        testSequences.append(temp_sub_list_seq)
        testNames.append(temp_sub_list_names)

print (testSequences)
print (testNames)
输出

[['tt', 'gg'], ['AAAAAAA', 'CCCCCC', 'TTTTTT', 'GGGGGG'], ['aaaa', 'cccc']]
[['>xx_redFish |xxx', '>xx_blueFish |xxx'], ['>xx_oneFish |xxx', '>xx_twoFish |xxx', '>xx_redFish |xxx', '>xx_blueFish |xxx'], ['>xx_oneFish |xxx', '>xx_twoFish |xxx']]
注意: 1.如果脚本位于文本文件所在的同一文件夹中,这将起作用。 2.这不会检查以
'>'
开头的行之后的行中的预期值。也就是说,如果您的
.txt
文件如下所示:

>xx_oneFish |xxx
aaaa
bbbb
dddd
>xx_twoFish |xxx
cccc

对于该文件,
testSequences
中生成的子列表将是
['aaaa',bbbb',dddd',cccc']

这是可行的,但现在已将testname更改为输出序列数据,而不是序列名
['xx_oneFish | xxx',xx_twoFish | xxx'],['xx_红鱼| xxx',xx|蓝鱼| xxx'],['xx_-oneFish | xxx','xx_-twoFish | xxx','xx_-redFish | xxx','xx_-blueFish | xxx']