Python 如何在fasta文件中选择头的最后一个字符?
我有一个类似这样的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.
>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)