我正在尝试将数百个.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
有什么建议吗?谢谢!
答案 0 :(得分:8)
我认为使用python
来完成这项工作是过度的。在命令行上,使用.fasta
或.fa
扩展名连接单个/多个fasta文件的快捷方法是:
cat *.fa* > newfile.txt
答案 1 :(得分:1)
问题出在fasta.py
:
else:
seq += line[:-1]
aninstance = fasta(name, seq)
尝试在seq
开始之前初始化read_fasta(file)
。
编辑:进一步解释
当您第一次调用read_fasta
时,文件中的第一行不会以>
开头,因此您将第一行追加到尚未初始化的字符串seq
(甚至没有声明):你将一个字符串(第一行)附加到一个空值。堆栈中出现的错误解释了问题:
UnboundLocalError: local variable 'seq' referenced before assignment
答案 2 :(得分:1)
不是python程序员,但似乎问题代码试图在一行中压缩每个序列的数据,并且还用空行分隔序列。
>seq1
00000000
11111111
>seq2
22222222
33333333
会变成
>seq1
0000000011111111
>seq2
2222222233333333
如果确实需要这个,那么基于 cat 的解决方案将无效。否则, cat 是最简单,最有效的解决方案。
答案 3 :(得分:1)
对于Windows OS,通过命令提示符:( Note-folder应该只包含必需的文件):
copy *.fasta **space** final.fasta
享受。
答案 4 :(得分:0)
以下内容可确保新文件始终以新行开头:
$ awk 1 *.fasta > largefile.fasta
使用cat
的解决方案可能对此失败:
$ echo -n foo > f1
$ echo bar > f2
$ cat f1 f2
foobar
$ awk 1 f1 f2
foo
bar