我正在尝试解析一个fasta文件,然后我想创建另一个文件,其中包含fasta文件的所有可能的第100个ATGCN序列。
例如:
chr1_1-100:ATGC.....GC
chr1_2-101:ATGC.....GC
chr1_3-102:ATGC.....GC
......................
chr22_1-100:ATGC....cG
chr22_2-101:ATGC....cG
......................
我使用以下代码完成了它:
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
records = SeqIO.to_dict(SeqIO.parse(open(i1), 'fasta'))
with open(out, 'w') as f:
for key in records:
long_seq_record = records[key]
long_seq = long_seq_record.seq
length=len(long_seq)
alphabet = long_seq.alphabet
for i in range(0, length-99):
short_seq = str(long_seq)[i:i+100]
text="@"+key+"_"+str(i)+"-"+str(i+100)+":"+"\n"+short_seq+"\n"+"+"+"\n"+"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n"
f.write(text)
问题是写入的文件没有被排序。它首先可以包含chr10
然后chr2
。
问题出现了,因为解析是使用dict(
完成的,例如SeqIO.to_dict(SeqIO.parse(open(i1), 'fasta'))
。
那么,我可以将dict转换为有序的dict,以便我的文件有序吗?或者还有其他方法可以获得解决方案吗?
答案 0 :(得分:0)
我可以在Python中将defaultdict或dict转换为ordereddict吗?
是的,您可以将其转换为OrderedDict(any_dict)
,如果您需要订购密钥,则可以在创建OrderedDict
之前对其进行排序:
>>> from collections import OrderedDict
>>> d = {'c':'c', 'b':'b', 'a':'a'}
>>> o = OrderedDict((key, d[key]) for key in sorted(d))
>>> o.items()[0]
('a', 'a')
>>> o.items()[1]
('b', 'b')
>>> o.items()[2]
('c', 'c')
答案 1 :(得分:0)
根本不打算制作任何类型的词典。你不需要dict给你的属性,你需要dict转换丢失的信息。来自SeqIO.parse
的记录迭代器已经为您提供了所需内容:
with open(i1) as infile, open(out, 'w') as f:
for record in SeqIO.parse(infile, 'fasta'):
# Do what you were going to do with the record.
如果您需要dict键中的信息,那就是record.id
。
答案 2 :(得分:0)
您已正确识别问题的原因:to_dict
方法返回一个dict,表示订单已丢失。从那时起,就无法恢复订单。
更多,你并没有真正使用dict,因为你按顺序处理所有内容,所以你可以迭代:
for record in SeqIO.parse(open(i1), 'fasta')) :
key = record.id
long_seq = record.seq
...