Учебная страница курса биоинформатики,
год поступления 2013
Практикум 6. Задания
Результатом этого задания является скрипт на языке Python, в котором реализованы перечисленные в заданиях 1 и 2 функциональности. Скрипт должен быть положен в папку зачетных заданий до 23:59 дня накануне следующего занятия.
Внимание! Как и раньше, имя скрипта должны быть в том же формате, что и названия протоколов. Сейчас требуется один скрипт, поэтому порядковый номер указывать не нужно. Например, ДД должна назвать свой скрипт так: Dibrova_pr6.py.
Не забывайте смотреть подсказки по python, в которые добавлены пояснения по тем разделам, которые введены на этом занятии (а также к некоторым разделам, которые есть в презентации, но на которые не хватило времени при объяснении). В презентации тоже есть много примеров. И не стесняйтесь спрашивать любого из преподавателей, если что-то не получается!
Акция "Ошибайтесь и получайте бонусные баллы!" продолжается! Как? Посмотрите необязательное задание №4 уже сейчас!
1. Начиная с этого раза, мы перестаем указывать на необходимость каждый раз создавать новую рабочую директорию и прочие стандартные технические вещи. Предполагается, что уже выработалась привычка делать это по умолчанию! 2. Приведенные в начале тренировочные задания не являются обязательными для зачета, но их очень рекомендуется попробовать сделать по возможности на занятии, чтобы сразу спросить преподавателя о трудностях. Умение выполнить их все - ключ к выполнению обязательного задания! Разбитый на отдельные блоки, составной ключ. 3. Советуем тренировочные задания делать в одном или нескольких вспомогательных скриптах, а НЕ В КОНСОЛИ Python, чтобы можно было сохранить результат и потом при выполнении домашнего задания быстро освежить в памяти.
Тренировочные задания
Задание 0. Тренировка отдельных навыков, нужных для выполнения основного задания
Логические операторы и операторы сравнения, условия, цикл while
Задайте несколько булевых переменных, которые получаются путем комбинации операторов сравнения (>, < и т.п.) и логических операторов (and, or, not). Угадайте, чему будет равен результат каждой, а потом выведите их на экран. Если получаются какие-то неожиданности, опишите их в протоколе практикума или сразу спросите у преподавателя.
- Попробуйте в зависимости от того, верна или нет какая-то из Ваших булевых переменных, напечатать на экране разные строки текста.
(чуть сложнее) Попробуйте использовать цикл while для того, чтобы вывести на экран значения числа в заданных Вами пределах (с определенным шагом) и его квадрата. Перенаправьте результат в файл, посмотрите, что получилось.
Задание кортежа и списка вручную и манипуляции с их элементами
Задайте кортеж, состоящий из двух чисел, какой-нибудь строки и булевой переменной со значением "ложь". Попробуйте вывести на экран кортеж целиком (print fooname), а также попробуйте напечатать элементы кортежа с номерами 0, 3 и 10.
- Попробуйте изменить первое значение кортежа на другое, не создавая новый кортеж, и вывести весь кортеж на экран. Что получилось?
- Задайте список, состоящий из тех же величин. Повторите с ним те же манипуляции. Что получилось?
Задание кортежа и списка в автоматическом режиме и манипуляции со всеми элементами через цикл for
Задайте переменную num, содержащую положительное целое число. Создайте список, хранящий числа от 0 до num. Выведите список на экран; проверьте, что последнее число – действительно num. Создайте другую переменную, в которой сохраните длину списка. Чему равно ее значение?
Сделайте то же самое для переменной neg_num, в которой сохраните отрицательное целое число. Что получилось?
Попробуйте функции range() подать на вход не одно значение, а два. Что будет, если первое меньше второго? Что будет, если второе меньше первого?
Исследование того, какими символами разделяются строки в текстовом файле
Создайте в рабочей директории текстовый файл из двух коротких слов на английском, но написанных на разных строках. Сохраните его. Откройте файл в режиме просмотра HEX-кодировки (откройте файл в режиме просмотра в Far Manager, т.е. не клавишей F4, а клавишей F3, и переключитесь с помощью горячей клавиши F4 из режима "Text" в режим "HEX").
- Обратите внимание на правую часть окна: оба слова оказались слеплены, но разделены парой странных символов (у меня отображается символ нотки и закрашенный квадратик с окружностью). В левой части окна посмотрите, каким шестнадцатеричным числом кодируется каждый из этих символов?
Замечание: первый из этих символов ("нотка") является своеобразным "динозавром", который есть в Windows, но отсутствует в Unix-подобных операционных системах (например, в Linux, с которым Вы будете работать достаточно скоро). Этот символ называется возвратом каретки и в программировании обозначается \r (символ \ является служебным - он указывает на то, что речь идет не о букве r, а о специальном символе возврат каретки). Второй символ – это собственно символ перевода строки, и он обозначается \n. Итого, в Windows перевод строки кодируется двумя символами, что периодически вызывает разные конфузы, а в Linux - одним.
Попробуйте сохранить файл в формате операционной системы Unix. Для этого откройте его для редактирования и нажмите <Shift + F2> ("Save As..."). В нижней части окна ("Change line breaks to:" выберите "Unix format") и смените имя файла. Откройте новый файл в режиме просмотра HEX-кодировки. Что изменилось?
Проход по всем символам строки вручную
Задайте свою собственную функцию, которая получает на вход строчку, перебирает все символы этой строки и избавляется от всех символов \r и \n. Вариант алгоритма: создать в теле функции новую строку, в которую будут копироваться все символы кроме этих двух, а потом строку вернуть.
Разумеется, для этого существует уже написанная функция Не используйте ее сейчас, если даже знаете, попробуйте написать простенький алгоритм, чтобы проверить себя.
Чтение текстового файла построчно и сохранение информации
- Создайте в рабочей директории текстовый файл, содержащий несколько (штуки 3-4) разных строк с английскими символами. Сохраните его.
Откройте файл для чтения в своем скрипте, присвоив любой переменной результат вызова функции open() с именем созданного файла как аргументом.
Проверьте тип получившейся переменной с помощью функции type()
Создайте другую переменную, в которой сохраните все строки файла в виде списка. Это можно сделать с помощью функции list(), если подать ей на вход переменную типа file.
- Выведите получившийся список на экран целиком командой print. Что получилось?
Сохраните все строчки файла в виде одной длинной строки. Для этого задайте сперва пустую строковую переменную (например, так: long_string = ""). Потом используйте цикл for, пройдите по всем строчкам файла. Используя написанную в п. 5 функцию, отрезайте от каждой строчки символ конца строки. После этого с помощью оператора + дописывайте к строке long_string результат.
Обязательные задания
Обратите внимание: задание 1 написано в двух редакциях (ААл и ДД). В них требуется сделать одно и то же, но способ объяснения того, что надо, разный Выберите тот, который покажется Вам более близким!
Задание 1 (редакция ААл). Создать скрипт, который вычисляет длину последовательности из файла в fasta-формате и выводит результат в поток выхода (на экран монитора).
Скопируйте в папку pr6 fasta-файл с аминокислотной последовательностью вашего белка (из pr3). Если такого еще нет, то создайте тестовый файл test.fasta, например, такой:
>test_protein Hypothetical protein MTSKLLVSTFGW QErtK
Создайте файл скрипта с нужным именем и расширением .py
- Напишите команды
открыть файл, указав его имя как текстовую переменную, например: fasta_file = open("myfile.fasta")
создать пустую переменную типа str для последовательности, например, sequence = ""
создать переменную - счетчик строк, например, n=0
начать цикл для перебора строк входного файла с помощью оператора for
- тело цикла:
- увеличьте счетчик, так как в цикл входите со следующей (в начале - с первой) строкой
к строке примените метод strip() для удаления незначащих символов с начала и с конца строки, например:
- Напишите команды
line = line.strip(), где line – переменная, содержащая строку символов. Незначащие символы - пробелы, символы конца строки, символы табуляции и т.п. - называются 'white space'.
- поставьте проверку того, не пустая ли строка, если пустая – переходите к следующей строке. Это делается так:
if len(line)==0: continue
Команда continue в любом месте цикла форсирует переход к началу цикла со следующим элементом списка
поставьте проверку номера строки; если строка первая, то из этой строки извлеките идентификатор последовательности и ее описание и сохраните их в соответствующих переменных, например, id и description. Это делается так:
line_list = line.split()
Строка, содержащаяся в переменной line, разбивается на подстроки по символам white space и из подстрок составляется список. В соответствии с fasta-форматом, первый элемент этого списка, т.е. line_list[0], как раз и будет идентификатором последовательности (только первый символ “>” не следует включать в id), а все остальные элементы списка являются описанием. Тут еще будет над чем подумать и узнать как это все сделать.
Если строка не первая, то все ее содержимое – часть последовательности. Ее надо добавить в переменную sequence. Это делается так: sequence = sequence + line
После завершения цикла вы получаете три текстовые переменные: id, description, sequence.
Если все получилось правильно, то Вы практически победили! Но давайте сначала проверим результат, например, добавим команду: print (id, description, sequence)
- Запускаете скрипт, смотрите какую ошибку и в какой строке он обнаружил, открываете файл, исправляете ошибку (если не получается, то просите помощи у преподавателей или друзей или кого угодно – только запретите им набирать команды самим, пусть объясняют, иначе ничего не запомните!)
- Повторяете предыдущую процедуру пока не иссякнут ошибки – раз десять, я думаю.
Смотрите, что скрипт выдаёт в выходной поток: то или нет? Результат должен выглядеть примерно так: ('test_protein', 'hypothetical protein', 'MTSKLLVSTFGWQErtK')
Если получилось, то примите мои поздравления: Вы - герой, что бы еще не требовала от вас udavdasha! Спокойно ложитесь спать – если еще не пора идти к 9 в Университет
- Для порядка еще переделайте печать на печать длины последовательности. Когда программа выдает результат, исправить этот результат на нужный - просто.
Замечания.
Метод - это функция, которую можно применить к объекту данного типа. Например, к переменной типа int можно применить метод "прибавить другое число". Это можно записать так:
x = 2 x.__add__(2)
Пишется имя объекта, точка, название метода, в скобках - аргументы; сам объект x также является аргументом метода. Для сложения (и др.) введены специальные выражения, заменяющие стандартный способ написания метода, а именно: x + 2. Два выражения: x.__add__(2) и x+2 являются синонимами.
- strip() и split() - методы строки, для них нет других выражений; обязательных аргументов у них нет (у split() есть, но необязательные), поэтому скобки являются признаками того, что это - функции.
Чтобы узнать все методы объекта типа str, в консоли python наберите help(str)
(*) Найдите метод строки, превращающий все буквы - в заглавные, и примените его к строковой переменной sequence
Задание 1 (редакция ДД). Чтение файла в fasta-формате.
Напишите скрипт, который сохраняет в памяти информацию из файла в fasta-формате, рассчитывает длину последовательности и выводит ее на экран. Скрипт должен делать следующее:
содержать заданную переменную с именем файла в fasta-формате, который надо прочитать (например, filename = "Dibrova_YP0000001.fasta")
- читать заданный файл с последовательностью белка в fasta-формате и создавать три переменные:
- переменную с идентификатором последовательности;
- переменную с описанием последовательности;
переменную с самой последовательностью, сохраненной в виде одной строки, без символов пробела, конца строки (\n или \r).
вычислять и выводить на экран длину последовательности (нуклеотидов или аминокислот). Важно: не просто длину, а строчку, где написано какая величина посчитана и выведена.
! Опробуйте такой алгоритм разбора первой строки. Как разделить первую строку на идентификатор и описание? Во-первых, нужно пропустить самый первый символ: это знак >, который в идентификатор не входит. Затем нужно в одну переменную записать все до первого пробела, а в другую - все после него. Значит, разумно создать булеву переменную, с именем, например, space_found и задать ей начальное значение True. Пока пробела не найдено (т.е. выполняется условие space_found == False), перебирайте символы строки из файла по очереди (начиная со второго, ведь первый – это не нужный нам >) и сравнивайте их с пробелом. Если символ не пробел, то дописывайте его к переменной, где будет храниться идентификатор. А как только попадется пробел – поменяйте значение переменной space_found на True. Пусть в режиме, когда выполняется условие space_found == True, цикл дописывает все остальные символы в переменную, где будет храниться описание; теперь уже сравнивать их с пробелами не нужно.
Задание 2. Распечатка данных в fasta-формате с желаемым числом букв в строке
Цель этого задания – добавить в Ваш скрипт возможность печатать на экран данные данные о последовательности в fasta-формате (так, чтобы при перенаправлении потока STDOUT в файл получился нормальный файл в fasta-формате) с любым заданным числом букв в строке последовательности.
- Задайте в своем скрипте функцию, которая будет получать на вход три параметра последовательности, прочитанные Вами ранее из файла, а также четвертый параметр - желаемое количество букв в строке последовательности.
- Пусть эта функция выводит на экран данные о последовательности в fasta-формате, но так, чтобы число букв было равно поданному на вход функции числу.
- Вызовите функцию из тела скрипта и убедитесь, что теперь скрипт печатает первой строчкой данные о длине последовательности (из задания 1), а далее следует информация в fasta-формате с желаемым размером строки.
Задание 3. Убедитесь, что скрипт работает
Проверьте правильность работы своего скрипта на файлах в fasta-формате, которые Вы создавали для генома вируса и для своего белка.
! Если Вы еще не перенесли файл с последовательностью своего белка в fasta-формате в директорию credits первого блока, сделайте это сейчас. Еще раз проверьте, что файлы в директории credits первого блока у Вас представляют собой файлы в fasta-формате – на них преподаватели будут проверять, действительно ли работает Ваш скрипт!
Необязательные задания (на дополнительные баллы)
Задание 4*. Коллекционер и победитель ошибок (продолжение)
Соберите коллекцию ошибок Вашего скрипта, с которыми Вы столкнулись в процессе работы. Предоставьте в папке credits второго блока протокол с обычным именем (например, Dibrova_pr6.doc), в котором будет приведена следующая информация об ошибках. Протокол оформите в удобном для Вас формате, но чтобы было понятно, что происходит. Про каждый случай укажите:
Ошибка, выданная Python (чтобы получить текст ошибки в текстовый файл, а не просто на экран, воспользуйтесь подсказками к предыдущему занятию).
- Место в скрипте, вызвавшее ошибку (та строчка или строчки, из-за которых все пошло наперекосяк).
- Объяснение, что именно неверно.
- Исправленная, работающая версия.
Ошибки в протоколах за практикумы 5 и 6 не должны повторяться. Задание называется "Коллекционер и победитель ошибок", а не "Любитель гулять по граблям"