|
Практикум 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,
зарегистрироваться там и пройти как можно больше разделов.
Очень прикольная штука, как оказалось :)
|
|