从字符串中或文件中获取序列信息

#从长度不是特别长的fasta_string中获取序列,去除序列中的空格并全部转为大写,序列以(序列名,序列)的形式,保存到列表中
def get_sequences_from_fasta_string(fasta_string):
assert isinstance(fasta_string,str)
sequences=[]
for item in fasta_string.split('>')[1:]:
seq_name=item.split('\n')[0]
seq=''.join(''.join(item.split('\n')[1:]).split()).upper()
sequences.append((seq_name,seq))
return sequences

# 将一个文件夹内的序列文件提取生成到一个fasta文件里
import glob
extend_names=['txt','seq','fasta']
s=''
for extend_name in extend_names:
for filename in glob.glob(r'c:\users\seln\desktop\sequences\*.{}'.format(extend_name)):
with open(filename,'r')as f:
seq=''.join(list(filter(lambda char:char.isalpha(),
f.read())))
s+=">%s\n%s\n" % (filename.split('\\')[-1],seq)


#利用生成器,从序列数非常巨大的文件里读取序列
def get_items_from_file(filename,testfun=None):
with open(filename) as file:
return get_items(file,testfun)

def get_items(src,testfun=None):
return [item for item in item_generator(src) if not testfun or testfun(item)]

def item_generator(src):
skip_intro(src)
des=[]
seq=''
for line in src:
if line[0]=='>':
if des:
yield des,seq
des=line[1:-1].split('|')
seq=''
else:
seq+=line[:-1]
yield des,seq

def skip_intro(src):
line=src.readline()
while line[0]!='A':
line=src.readline()

def find_item_in_file(filename,testfun=None):
with open(filename)as file:
return find_item(file,testfun)

def find_item(src,testfun=None):
gen=item_generator(src) #生成器函数一定要赋给一个变量后使用!!!
item=next(gen)
if not testfun:
return item
else:
try:
while not testfun(item):
item=next(gen)
return item
posted @ 2019-02-15 17:20  bluemoonsky  阅读(389)  评论(0编辑  收藏  举报