Python:如何在输出中输出正确的染色体名称?

标签 python bioinformatics regular-language

当我尝试修改染色体名称不遵循我的输入文件染色体名称的代码时,我遇到了此错误。基本上,下面的代码是读取输入文件并通知较短序列的位置,并根据文件中给出的信息输出位置序列。例如,在 chr4: 154742507-154742714 中,值 151 表示第一个碱基的位置,而“CCCAGGCTGG”位置是 173 - 182。因此,使用下面的代码应该能够通过将 173 添加到 154742507 并获得下面的输出。谁能帮我吗?

下面是带有示例输入文本文件的代码。

输入.txt

chr4:154742507-154742714


                           CCCAGGCTGG
151  AGTCTTGCTTTTTTTGTCGTTGCCCAGGCTGGAGTGCAGTGGCACCATCTCGGCTCAC


chr9:47303792-47303999

      CCAGCCTGGG
1    TCCAGCCTGGGTGACAGCGTGAGGCTCTTGTCTCAAATAGAAAAAAAACAAAGAACAAAAAACAAAAAACCACCA

输出

chr1    154742680   154742690
chr1    47303794    47303804

预期输出

chr4    154742680   154742690
chr9    47303794    47303804

代码

import re  # regular expressions, not needed (alternatives: the `split` method) but convenient

result = []
output_file=open('output.bed','w')
with open('Input.txt') as f:
    for line in f:
        if line.startswith('chr'):
            label = line.strip()
        elif line[0] == ' ':
            # short sequence
            length = len(line.strip())
            # find the index of the beginning of the short sequence
            for i, c in enumerate(line):
                if c.isalpha():
                    short_index = i
                    break
        elif line[0].isdigit():
            # long sequence
            n = line.split(' ')[0]
            # find the index of the beginning of the long sequence
            for i, c in enumerate(line):
                if c.isalpha():
                    long_index = i
                    break
            start = int(n) + short_index - long_index
            start -= 1
            end = start + length
            result.append('{} {} {}'.format(label, start, end))
            offset, n, start, length = 0, 0, 0, 0
output_line= "\n".join(result)
output_file.write(output_line)
output_file.close()

output_file=open('last_output.bed','w')
with open('output.bed') as fin:
    for line in fin:
        start, _, offset_start, offset_end = re.search(r'[^:]*:(\d+)\D+(\d+)\D+(\d+)\D+(\d+)', line).groups()
        output_line=('chr1\t{}\t{}\n'.format(int(start) + int(offset_start) + 1,int(start) + int(offset_end) + 1))
        output_file.write(output_line)
output_file.close()

最佳答案

如果我正确理解了问题,那么您遇到的问题仅与输出不正确的染色体编号 (chr##) 有关。

这似乎有点明显。在代码末尾,您对其进行硬编码:

output_line=('chr1\t{}\t{}\n'.format(stuff))

如果您不希望输出始终显示 chr1,则需要进行更改。

前一行的正则表达式似乎与文件中的染色体编号匹配,您只是没有将其捕获到稍后可以使用的组中。尝试:

chromosome, start, _, offset_start, offset_end = re.search(r'([^:]*):(\d+)\D+(\d+)\D+(\d+)\D+(\d+)', line).groups()
output_line=('{}\t{}\t{}\n'.format(chromosome, int(start) + int(offset_start) + 1,int(start) + int(offset_end) + 1))

这仍然相当难看,但应该可行。请注意,如果您从初始循环中获得正确的输出,而不是写出中间格式然后需要重新解析它,那么会容易得多。

关于Python:如何在输出中输出正确的染色体名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32667795/

相关文章:

linux - 如何将文件列表传递给并行命令并执行下游命令,例如 samtools?

linux - 用于一次性 CLI 应用程序的 Docker

algorithm - 计算两个序列之间相似度的复杂度

grammar - 左线性和右线性语法

python - 装饰器作为类

python - 当我重新启动 Tornado 服务器时,html 文件中的更改不会生效

prolog - 如何在 Prolog 中创建这个 DCG?

javascript - 使用正则表达式检测 img src 中的反斜杠

python - 自定义绘图函数在交互式提示中第二次调用时不执行任何操作

Python3 字符串到十六进制错误在文件中,但在终端中没有