Похоже, вы когда-либо использовали только длину записи и идентификатор из файла. Вы можете просто загрузить их в список кортежей или два отдельных списка и передать их. Конечно, нет причин продолжать анализировать файл снова и снова.
Сначала напишите функцию для загрузки соответствующих данных. Я думаю, что пара списков лучше, так как вы используете идентификаторы только один раз:
def load_file(filename):
data = [(rec.id, len(rec)) for rec in SeqIO.parse(fasta_file, "fasta")]
# Transpose the data into two lists instead of list of pairs
return tuple(map(list, zip(*data)))
Теперь ваши вызовы функций должны выглядеть как
fasta = 'filename.fa'
ids, sizes = load_file(fasta)
fasta_outlook(sizes)
fasta_lendist(sizes)
fasta_burst(ids, sizes)
В fasta_outlook
и fasta_lendist
вы просто меняете имя входного параметра на sizes
и удаляете понимание, которое вычисляет эти значения. В fasta_burst
вы можете несколько упростить цикл:
def fasta_burst(ids, sizes):
'''Reports the length of each fasta sequence in the file. Takes filename as string'''
with open("Seq_length.tab","w") as my_file:
for id, rec in zip(ids, sizes):
my_file.write('{}\t{}\n'.format(id, size))
print("Length report written in Seq_length.tab")
Используйте блок with
, убедитесь, что ваш файл закрыт после того, как вы покончили с ним. Вы вообще не закрывались раньше, и with
имеет преимущество закрытия даже в случае ошибки.