【问题标题】:Replacing only some line endings with a tab delimiter仅用制表符分隔符替换某些行尾
【发布时间】:2017-03-04 09:24:56
【问题描述】:

我目前有一个 FASTA 文件,其中包含多个 DNA 序列。

描述符之间的替代行:“>\w{4}\d{6}” 还有一个 DNA 序列文件——一行 300 多个随机大写字母。

我试图使每个序列制表符分隔,以便每个描述符和序列都在一行上,由制表符分隔。以下是我尝试过的:

from __future__ import print_function
import re
import sys

Fasta_seq = open(sys.argv[1])
for a_line in Fasta_seq:
  if re.search('^>.+', a_line):
     re.sub('.+\n', '.+\t', a_line)
     print(a_line, end='')
  else:
    re.sub('.+', '.+', a_line)
    print(a_line, end='\n')

但是,这段代码似乎并没有删除在我的描述符末尾结束的行。它只是返回给我完全相同的输出。

有人知道我忽略了什么吗?

【问题讨论】:

  • for a_line in Fasta_seq: 之后,在if 行之前添加一个缩进的a_line = a_line.strip()。还要删除else 子句中print 上的end='\n'
  • 你在 Windows 上吗?
  • 是的,我正在运行 Windows 7。
  • @Martineau 看来您的代码有效。但是,描述符后面的选项卡没有出现,因为我认为它会出现在“if”语句中。你能明白为什么吗?就好像我的 re.sub 函数不起作用一样。
  • a_line.strip() 在读取的每一行末尾删除换行符,因此没有尾随 \n 匹配。坦率地说,我根本不知道您为什么要使用re。剥离线路后,只需检查线路是否以'>' 开头。如果是,则使用end='\t' 打印,如果不是,则正常打印(使用默认的end='\n')。

标签: python python-2.7 fasta


【解决方案1】:

我不确定您是在处理 leave 还是 interleave fasta,但无需正则表达式即可轻松完成此任务(另外,使用 4 个空格缩进)。请尝试以下操作:

Fasta_seq = open(sys.argv[1])
output_file = open("outfile.txt", "w")

seq = ""

for a_line in Fasta_seq:

    if a_line.startswith(">"):

        # Do this only when a sequence has been populated
        if seq:
            output_file.write("{}\t{}\n".format(header, seq))

        header = a_line.strip()
        seq = ""

    else:
        seq += a_line.strip()

这应该适用于离开和交错 fasta 输入

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 2020-07-29
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多