Home About Materials FBB site

Практикум 11. Контрольная работа. Регулярные выражения.

Задание 1. Сложный вариант контрольной . Мнемоника: control_hw.

Написать программу, которая принимает в командной строке имя файла в формате GenBank и два натуральных числа (начало и конец интервала последовательности ДНК). Предполагается, что в той же директории, что и файл GenBank, находится файл в формате fasta, чьё имя отличается от GenBank-файла только заменой расширения: с ".gbk" на ".fasta", и который содержит ту же самую последовательность, которая описана в GenBank-файле. Если в указанный интервал целиком попадает хотя бы одна описанная в GenBank-файле кодирующая последовательность (CDS), программа должна формировать файл с именем "cds.fasta", в котором должны присутствовать последовательности всех участков прямой цепи, которые соответствуют (совпадают или комплементарны) описанным в нём CDS, целиком попадающим в указанный интервал. Последовательности должны называться cds1, cds2 и т.д. Требуется перейти к комплементарной последовательности для CDS на комплементарной цепи; кроме того, последовательности должны быть разбиты на строки по 60 букв (кроме последней строки).
Запуск программы: python cw2-3.py NC_012492.gbk 280 2000
Возможная выдача:
 
    >cds1
    atgtcgaagcgtcccgccgatatagtcatttccactcccgcttccaaggttcgtcgccgg
    ctgaacttcgacagcccatatgtcagccgtgctgttgcccccactgtcctcgtcacaaac
    aaaaggaggacatgggt
    >cds2
    atggattcacgcacaggggaactcatcac
    >cds3
    atgcagaattcttcaccctcaccgagccgttgtactcaggtacccatcaaagtccagcac
    agaatagccaagaagagaccagttcgcagacgtaggatagatcttccctgcggttgctct
    tactattttggacttgactgcgcatcacatggattcacgc

from sys import argv doc = argv[1] fasta = doc[:-4] + ".fasta" start = int(argv[2]) stop = int(argv[3]) gbk = open(doc, "r") cds = [] compl = [] index = -1 for line in gbk: if line.find("CDS") == 5 and "complement" not in line: complement = "no" coord = line.strip().split()[1].split("..") if int(coord[0]) >= start and int(coord[1]) <= stop: cds.append(coord) index += 1 compl.append(index) compl.append(complement) if line.find("CDS") == 5 and "complement" in line: complement = "yes" start1 = line.find("(") stop1 = line.find(")") coord = line[(start1+1):stop1].split("..") if int(coord[0]) >= start and int(coord[1]) <= stop: cds.append(coord) index += 1 compl.append(index) compl.append(complement) gbk.close() if len(cds) > 0: seq_parts = [] inf = open(fasta, "r") outf = open("cds.fasta", "w") for line in inf: if ">" not in line: seq_parts.append(line.strip()) seq = "" for i in seq_parts: seq += i ind = 1 for j in cds: length = 0 outf.write(">cds"+str(ind)+"\n") if compl[(cds.index(j))+ind] == "no": cds_seq = seq[(int(j[0])-1):int(j[1])] if compl[(cds.index(j))+ind] == "yes": cds_compl = seq[(int(j[0])-1):int(j[1])] cds_seq = "" for i in range((len(cds_compl)-1), -1, -1): if cds_compl[i].lower() == "a": cds_seq += "t" if cds_compl[i].lower() == "t": cds_seq += "a" if cds_compl[i].lower() == "c": cds_seq += "g" if cds_compl[i].lower() == "g": cds_seq += "c" for letter in cds_seq: outf.write(letter) length += 1 if length == 60: outf.write("\n") length = 0 outf.write("\n") ind += 1 outf.close() inf.close()

Задание 2.

Необходимо пройти на сайт https://regexcrossword.com, зарегистрироваться там и пройти как можно больше разделов.

Очень прикольная штука, как оказалось :)


© Титова Алена, 2017