繁体   English   中英

连接多个.fasta文件

[英]Concatenating Multiple .fasta Files

我正在尝试将数百个.fasta文件连接成一个包含所有序列的单个大型fasta文件。 我还没有找到在论坛中完成此任务的具体方法。 我确实从http://zientzilaria.heroku.com/blog/2007/10/29/merging-single-or-multiple-sequence-fasta-files中找到了这个代码,我已经调整了一下。

Fasta.py包含以下代码:

class fasta:
    def __init__(self, name, sequence):
        self.name = name
        self.sequence = sequence

def read_fasta(file):
    items = []
    index = 0
    for line in file:
        if line.startswith(">"):
           if index >= 1:
               items.append(aninstance)
           index+=1
           name = line[:-1]
           seq = ''
           aninstance = fasta(name, seq)
        else:
           seq += line[:-1]
           aninstance = fasta(name, seq)

    items.append(aninstance)
    return items

以下是连接.fasta文件的改编脚本:

import sys
import glob
import fasta

#obtain directory containing single fasta files for query
filepattern = input('Filename pattern to match: ')

#obtain output directory
outfile = input('Filename of output file: ')

#create new output file
output = open(outfile, 'w')

#initialize lists
names = []
seqs = []

#glob.glob returns a list of files that match the pattern
for file in glob.glob(filepattern):

    print ("file: " + file)

    #we read the contents and an instance of the class is returned
    contents = fasta.read_fasta(open(file).readlines())

    #a file can contain more than one sequence so we read them in a loop
    for item in contents:
        names.append(item.name)
        seqs.append(item.sequence)

#we print the output
for i in range(len(names)):
    output.write(names[i] + '\n' + seqs[i] + '\n\n')

output.close()
print("done")

它能够读取fasta文件,但新创建的输出文件不包含序列。 我收到的错误是由于fasta.py,这超出了我的能力:

Traceback (most recent call last):
  File "C:\Python32\myfiles\test\3\Fasta_Concatenate.py", line 28, in <module>
    contents = fasta.read_fasta(open(file).readlines())
  File "C:\Python32\lib\fasta.py", line 18, in read_fasta
    seq += line[:-1]
UnboundLocalError: local variable 'seq' referenced before assignment

有什么建议么? 谢谢!

我认为使用python来完成这项工作是有点过头了。 在命令行上,将单个/多个fasta文件与.fasta.fa扩展名连接起来的快速方法是:

cat *.fa* > newfile.txt

问题在于fasta.py

else:
       seq += line[:-1]
       aninstance = fasta(name, seq)

尝试在read_fasta(file)开始之前初始化seq

编辑:进一步解释

当你第一次调用read_fasta ,文件中的第一行不以>开头,因此你将第一行附加到尚未初始化的字符串seq (甚至没有声明):你附加一个字符串(第一行)为空值。 堆栈中出现的错误解释了问题:

UnboundLocalError: local variable 'seq' referenced before assignment

不是python程序员,但似乎问题代码试图在一行中压缩每个序列的数据,并且还用空行分隔序列。

  >seq1
  00000000
  11111111
  >seq2
  22222222
  33333333

会成为

  >seq1
  0000000011111111

  >seq2
  2222222233333333

如果这实际上是需要上面基于的解决方案将无法工作。 否则, 是最简单,最有效的解决方案。

对于Windows OS,通过命令提示符:( Note-folder应该只包含必需的文件):

copy *.fasta **space** final.fasta  

请享用。

以下内容确保新文件始终以新行开头:

$ awk 1 *.fasta > largefile.fasta

使用cat的解决方案可能会失败:

$ echo -n foo > f1
$ echo bar > f2
$ cat f1 f2
foobar
$ awk 1 f1 f2
foo
bar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM