当前位置: 首页 > 知识库问答 >
问题:

将大型fasta拆分为多个文件,无法使用GI编号命名

穆仲卿
2023-03-14

首先,我应该说我是Python和Biopython的新手。我想分一大块。将文件(具有多个条目)快速转换为单个文件,每个文件具有一个条目。我在BiopythonWiki/Cookbook网站上找到了以下大部分代码,并对其进行了一些修改。我的问题是,这个生成器将它们命名为“1.fasta”、“2.fasta”等,我需要用一些标识符(如GI编号)来命名它们。

 def batch_iterator(iterator, batch_size) :
    """Returns lists of length batch_size.

    This can be used on any iterator, for example to batch up
    SeqRecord objects from Bio.SeqIO.parse(...), or to batch
    Alignment objects from Bio.AlignIO.parse(...), or simply
    lines from a file handle.

    This is a generator function, and it returns lists of the
    entries from the supplied iterator.  Each list will have
    batch_size entries, although the final list may be shorter.
    """
    entry = True #Make sure we loop once
    while entry :
        batch = []
        while len(batch) < batch_size :
            try :
                entry = next(iterator)
            except StopIteration :
                entry = None
            if entry is None :
                #End of file
                break
            batch.append(entry)
        if batch :
            yield batch

from Bio import SeqIO
infile = input('Which .fasta file would you like to open? ')
record_iter = SeqIO.parse(open(infile), "fasta")
for i, batch in enumerate(batch_iterator(record_iter, 1)) :
    outfile = "c:\python32\myfiles\%i.fasta" % (i+1)
    handle = open(outfile, "w")
    count = SeqIO.write(batch, handle, "fasta")
    handle.close()

如果我尝试替换:

outfile = "c:\python32\myfiles\%i.fasta" % (i+1)

与:

outfile = "c:\python32\myfiles\%s.fasta" % (record_iter.id)

因此,它将命名类似于SeqIO中seq_record.id的东西,它会给出以下错误:

    Traceback (most recent call last):
  File "C:\Python32\myscripts\generator.py", line 33, in [HTML]
    outfile = "c:\python32\myfiles\%s.fasta" % (record_iter.id)
AttributeError: 'generator' object has no attribute 'id'

虽然生成器函数没有属性'id',但我能以某种方式绕过它吗?这个剧本对我来说太复杂了吗?!?谢了查尔斯

共有1个答案

方绪
2023-03-14

因为一次只需要一条记录,所以可以放弃批处理迭代器包装器和枚举:

for seq_record in record_iter:

然后你需要的是每个记录的id属性,而不是整个迭代器:

for seq_record in record_iter:
    outfile = "c:\python32\myfiles\{0}.fasta".format(seq_record.id)
    handle = open(outfile, "w")
    count = SeqIO.write(seq_record, handle, "fasta")
    handle.close()

为供参考,生成器错误是由于您试图从对象记录\u iter获取属性idrecord\u iter不是一条记录,而是一组记录,它们作为Python生成器保存,这有点像一个正在进行的列表,因此您不必一次读取整个文件,而且内存使用效率更高。关于生成器的更多信息:您可以使用Python生成器函数做什么,http://docs.python.org/tutorial/classes.html#generators ,

 类似资料:
  • 问题内容: 我想将一个大小约为50GB的大型文本文件拆分为多个文件。文件中的数据就像这样-[x = 0-9之间的任何整数] 文件中可能只有几十亿行,我想为每个文件写例如30/40百万。我想这些步骤将是- 我要打开文件 然后使用readline()必须逐行读取文件并同时写入新文件 一旦达到最大行数,它将创建另一个文件并再次开始写入。 我想知道如何将所有这些步骤以一种高效且更快的内存方式组合在一起。我

  • 问题内容: 我有从mongodb导出的json文件,如下所示: 大约有30000行,我想将每一行拆分成自己的文件。 (我正在尝试将我的数据转移到榻榻米群集上) 我尝试这样做: 但是我发现它似乎减少了行的负载,而当我期望30000个奇数时,运行此命令的输出仅给了我50个奇数文件! 有没有一种逻辑方法可以使此操作不使用任何适合的方法删除任何数据? 问题答案: 假设您不在乎确切的文件名,如果要将输入拆分

  • 问题内容: 将Spring的配置拆分为多个xml文件的正确方法是什么? 此刻我有 /WEB-INF/foo-servlet.xml /WEB-INF/foo-service.xml /WEB-INF/foo-persistence.xml 我有以下内容: 实际问题: 这种方法正确/最佳吗? 我真的需要同时指定中的配置位置 和该板块? 我需要记住什么才能能够引用中定义的?这与 指定有关吗? 更新1:

  • 问题内容: 我的体积太大了,很难找到正确的视图。 如何将其拆分为多个文件,然后导入?是否涉及速度损失? 我可以这样吗? 问题答案: 在Django中,所有内容都是Python模块(* .py)。你可以创建一个具有内部视图的文件夹,并且仍然可以导入视图,因为这也实现了Python模块。但是一个例子会更好。 你的原始图片可能如下所示: 使用以下文件夹/文件结构,它将起到相同的作用: viewsa.py

  • 问题内容: 我想要一个多页的pdf文件,并每页创建单独的pdf文件。 我已经下载了reportlab并浏览了文档,但它似乎是针对pdf生成的。我还没有看到有关处理PDF文件本身的任何信息。 有没有一种简单的方法可以在python中做到这一点? 问题答案: 等等

  • 问题内容: 有什么方法可以将.tfrecords文件直接拆分为多个.tfrecords文件,而无需回写每个Dataset示例? 问题答案: 您可以使用如下函数: 例如,要将文件分成100条记录,您可以执行以下操作: 这将创建多个较小的记录文件,等等。