Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在fasta文件中选择头的最后一个字符?_Python_String_Sequence_Fasta - Fatal编程技术网

Python 如何在fasta文件中选择头的最后一个字符?

Python 如何在fasta文件中选择头的最后一个字符?,python,string,sequence,fasta,Python,String,Sequence,Fasta,我有一个类似这样的fasta文件: >XP1987651-apple1 ACCTTCCAAGTAG >XP1235689-lemon2 TTGGAGTCCTGAG >XP1254115-pear1 ATGCCGTAGTCAA 我想创建一个文件,选择以“1”结尾的标题,例如: >XP1987651-apple1 ACCTTCCAAGTAG >XP1254115-pear1 ATGCCGTAGTCAA 到目前为止,我创建了以下内容: fasta = open('x.

我有一个类似这样的fasta文件:

>XP1987651-apple1
ACCTTCCAAGTAG
>XP1235689-lemon2
TTGGAGTCCTGAG
>XP1254115-pear1
ATGCCGTAGTCAA
我想创建一个文件,选择以“1”结尾的标题,例如:

>XP1987651-apple1
ACCTTCCAAGTAG
>XP1254115-pear1
ATGCCGTAGTCAA
到目前为止,我创建了以下内容:

fasta = open('x.fasta')
output = open('x1.fasta', 'w')
seq = ''

for line in fasta:
    if line[0] == '>' and seq == '':
        header = line
    elif line[0] != '>':
        seq = seq + line


for n in header:
    n = header[-1]
    if '1' in n:
        output.write(header + seq)
    header= line
    seq = ''


if "1" in header:
    output.write(header + seq)

output.close()
但是,它不会在创建的新文件中生成任何输出。你能指出错误吗?
谢谢

一个选项是将整个文件读入字符串,然后使用以下正则表达式模式使用
re.findall

[A-Z0-9]+-\w+1\r?\n[ACGT]+
示例脚本:

fasta=open('x.fasta')
text=fasta.read()
matches=re.findall(r'>[A-Z0-9]+-\w+1\r?\n[ACGT]+',文本)
打印(匹配)
对于您上面提供的示例数据,这将打印:

['>XP1987651-apple1\nACCTTCCAAGTAG', '>XP1254115-pear1\nATGCCGTAGTCAA']

您可以从获取单个记录的列表开始,这些记录由
'>'
分隔,并使用换行符
.split('\n',1)

然后,您可以简单地筛选出不以
1
1结尾的记录

for header, body in records:
    if header.endswith('1'):
        output.write('>' + header + '\n')
        output.write(body)

当您看到匹配的标题行时,可以非常简单地设置一个标志

以open('x.fasta')作为fasta,open('x1.fasta','w')作为输出:
对于fasta中的行:
如果line.startswith('>'):
select=line.endswith('1\n')
如果选择:
输出。写入(行)
这避免了将整个文件读入内存;一次只检查一行


请注意,
line
将在行尾包含换行符。我选择只保留它;有时,如果您使用
line=line.rstrip('\n')
对其进行修剪,并在必要时将其添加回输出中,事情会变得更容易。

感谢您的回复。但是,我没有得到任何输出。我在f.split(“>”)[1:]”中为行添加了“f=fasta.read()”和“modify”,否则我得到了一个错误AttributeError:“\u io.TextIOWrapper”对象没有属性“split”任何建议?添加了缺少的
.read()
感谢您的回复。但是,标题后面的正文有1000多个字符。脚本只打印几个字符。有什么建议吗?@Maribet听起来好像你没有把整个文件读入一个字符串。请确认您手中有全文。谢谢!它工作完美,非常简单。不客气,但请不要贴“谢谢”的便条。相反,对你觉得有用的答案进行投票,如果你想将问题标记为已解决,就接受其中一个答案。另见
for header, body in records:
    if header.endswith('1'):
        output.write('>' + header + '\n')
        output.write(body)