【问题标题】:Change DNA sequences in fasta file using Biopython使用 Biopython 更改 fasta 文件中的 DNA 序列
【发布时间】:2016-10-03 11:45:04
【问题描述】:

我有一个包含多个 DNA 序列的 fasta 格式文件。我想将每个序列的内容更改为另一个较小的序列,保持相同的序列 ID。 新序列在一个列表中。

with open("outfile.fa", "w") as f:
    for seq_record in SeqIO.parse("ma-all-mito.fa", "fasta"):
        for i in range(len(newSequences_ok)):
            f.write(str(seq_record.id[i]) + "\n")
            f.write(str(newSequences_ok[i]) + "\n")  

但我明白了:

IndexError: string index out of range

如何更改代码以使其正常工作?我认为问题在于我需要遍历原始 fasta 文件和包含新序列的列表。

原来的fasta文件是这样的:

>Sequence1
ATGATGCATGG
>Sequence2
TTTTGGGAATC
>Sequence3
GGGCTAACTAC
>Sequence4
ATCTCAGGAA

新序列的列表与此类似:

newSequences_ok=[ATGG,TTTC,GGTA,CTCG]

我想得到的输出是:

>Sequence1
ATGG
>Sequence2
TTTC
>Sequence3
GGTA
>Sequence4
CTCG

【问题讨论】:

  • 还有,newSequences_ok是什么?
  • 请提供有关您的数据结构的更多信息。如果您在不使用 BioPyton 的情况下创建一个最小的工作示例(包括所有 imports 等),那将是最简单的。顺便说一句:您使用哪个版本的 BioPython?
  • newSequences_ok 是一个列表,其中包含每个记录的新序列的字符串。这是我在 fasta 文件中想要的,而不是之前的序列
  • 我使用 Biopython 1.68

标签: python biopython fasta


【解决方案1】:

我认为这可能行得通:

records = SeqIO.parse("ma-all-mito.fa", "fasta")
with open("outfile.fa", "w") as f:
    for r, s in zip(records,newSequences_ok):
        f.write(r.seq.seq.split('\n')[0] + '\n')
        f.write(s + '\n')

如果不是(即使是这样)——您确实需要了解Biopython 的工作原理。您将SeqIO.parse 视为直接返回文件行的东西。相反,它返回具有seq 属性的SeqRecord 对象,该属性返回Seq 本身具有两个属性的对象,一个seq 属性(这似乎是您想要的)和一个alphabet 属性。在尝试修改之前,您应该专注于能够提取您感兴趣的信息。

【讨论】:

  • 它给出了这个错误:TypeError: 'generator' object is not subscriptable
  • @newa123 立即尝试
  • 另一个错误:TypeError: write() argument must be str, not SeqRecord
  • @newa123 然后再次添加str(如在编辑中)。我不确定这有什么意义。
  • 再一次:IndexError:列表索引超出范围。可能我之前的代码有错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
相关资源
最近更新 更多