Файлы и строки
Содержание
Ссылки
План рассказа
- Работа с файлами. Объекты класса file. Функция open.
- Хождение по файлу циклом for
- хинт: str.strip
- хинт: enumerate
- Методы: read, write
- Форматы CSV и TSV
- Ещё раз про строки: split, join, startswith, isalpha, replace
- Форматирование выдачи: str.format
- optparse
Болванка для скрипта
1 #!/usr/bin/python
2 """Sepuliakr -- a tool for abstracting sepulia before sepulking."""
3 # Русские комментарии из тела программы нужно удалить,
4 # иначе питон будет ругаться -- и поделом! Вы не только для себя пишете,
5 # а далеко не все, кто это будут читать, знают русский.
6 import optparse
7 import doctest
8 import sys
9
10 def main(options, args):
11 # Здесь мы пишем самый содержательный код
12 # Например:
13 print options.quality
14 print args
15
16 # Здесь мы пишем другие функции
17 # Лучше функции располагать в таком порядке:
18 # 1) сначала важное, потом вспомогательное
19 # 2) функции из одной темы идут рядом, из разных тем порознь
20
21 if __name__ == "__main__":
22 parser = optparse.OptionParser(description=__doc__)
23 parser.add_option("-q", "--quality",
24 help="Quality of sepulka involved")
25 parser.add_option("-t", "--test", action="store_true",
26 help="Run self-tests")
27 options, args = parser.parse_args()
28
29 if options.test:
30 failed, tests = doctest.testmod()
31 print "{0} failed of {1} tests".format(failed, tests)
32 sys.exit(failed != 0)
33
34 main(options, args)
Контрольная работа
- Имя:
- Нарисуйте состояние памяти интерпретатора питона после следующих действий:
Опишите функцию gcd(a, b), которая считает наибольший общий делитель двух чисел алгоритмом Евклида: до тех пор, пока одно из чисел не обратилось в 0, большее из чисел заменяем на остаток от деления большего числа на меньшее число; ответом будет значение того числа, которое в ноль не обратилось.
Задание
Памятка: задание – то, что обязательно выполнить для получения зачёта; упражнения – необязательные, но как правило задание решить проще, если сначала выполнить все упражнения; если вы меня пнёте, выдам вам комментарии про то, что и как лучше, и по заданию, и по упражнениям.
Напишите скрипт join.py, который объединяет две таблицы по заданному ключу. Таблицы подаются скрипту на вход в виде файлов в формате CSV, имена файлов передаются скрипту через командную строку. Программа выдаёт результирующую таблицу в файл, имя которого указано параметром -o (--output). Ключом первой таблицы является столбец, номер которого указан в параметре --key1, второй – --key2. Скрипт проверяет, что для каждого значения ключа в таблице встречается не более одной строки, и если это предположение не выполнено, выдаёт сообщение об ошибке и прекращает работу. Объединение таблиц происходит по следующему правилу: для каждой строки первой таблицы, имеющей значение k в колонке ключа, в конец этой строки дописывается содержимое строки второй таблицы, имеющей значение k в колонке ключа. Столбцы колонок нумеруются с 1.
Пример использования программы. Положим, в файле blastout.csv лежит такой текст:
short-query,seq7871,100.00,101,0,0,1227,1327,1,101,1e-48,200 short-query,seq7696,100.00,101,0,0,191,291,1,101,1e-48,200 short-query,seq4438,100.00,101,0,0,290,390,101,1,1e-48,200 short-query,seq3681,100.00,101,0,0,1037,1137,1,101,1e-48,200 short-query,seq3155,100.00,101,0,0,1543,1643,1,101,1e-48,200
а в файле sequences.csv лежит текст:
seq3155,AGAAGAATTTTGCGGTATATGGATGATGAGAAGATCAACACTCTATTGACTGACGACCCATTAAGTACACCTCTGCACTTGGTCAAAATGCACGACTTGCG seq3662,AAATCACCCAATTTTCTCCGCTTAAATGTTGAACAATAGTAATGACGTTGATCCTTAACCACAGAAATTATCGCGAGAAATGCCATTTTATAAAAAGATTC seq3681,TGTCACGACCGATTGACATTCTCTATTTGGATACCACCTATTGCAAGTCTTAATACACTTTTCCATCCTAAGAAGTGGTTTTGGGCTAGATTTAATCTTTG seq4438,CACGGTGTGAGAGTCAATACATGAATTGACGTGTTGAAGAGTCTTCTATTCATCCATACCAGCTAGAGATTAATTGCATACAGGGCATTCCACTGTCATTG seq4982,ATACTCTGAACACTCGTCCTTTAATGATTTGAAAATGTTCGTACAAGGCCTCAATAATCAGGTAAAGTCTGCAGATGGTAGACCGGTGGGAGTACGTAAAA seq7696,TTCTCTTCAAAAATTCTTTCGCTCTTTGTCTCCCGAACGAACGAAACAGTCAAAAACGTCACTTTATTGGAATCACATAAGCTACTCGTCTCATACATACA
То если мы запустим скрипт python join.py blastout.csv --key1 2 sequences.csv --key2 1 -o out.csv, то в файле out.csv должна оказаться такая таблица:
short-query,seq7871,100.00,101,0,0,1227,1327,1,101,1e-48,200 short-query,seq7696,100.00,101,0,0,191,291,1,101,1e-48,200,seq7696,TTCTCTTCAAAAATTCTTTCGCTCTTTGTCTCCCGAACGAACGAAACAGTCAAAAACGTCACTTTATTGGAATCACATAAGCTACTCGTCTCATACATACA short-query,seq4438,100.00,101,0,0,290,390,101,1,1e-48,200,seq4438,CACGGTGTGAGAGTCAATACATGAATTGACGTGTTGAAGAGTCTTCTATTCATCCATACCAGCTAGAGATTAATTGCATACAGGGCATTCCACTGTCATTG short-query,seq3681,100.00,101,0,0,1037,1137,1,101,1e-48,200,seq3681,TGTCACGACCGATTGACATTCTCTATTTGGATACCACCTATTGCAAGTCTTAATACACTTTTCCATCCTAAGAAGTGGTTTTGGGCTAGATTTAATCTTTG short-query,seq3155,100.00,101,0,0,1543,1643,1,101,1e-48,200,seq3155,AGAAGAATTTTGCGGTATATGGATGATGAGAAGATCAACACTCTATTGACTGACGACCCATTAAGTACACCTCTGCACTTGGTCAAAATGCACGACTTGCG
Упражнения
- Напишите скрипт print_args.py, который получает из командной строки параметры --apple (сокращённо -a), --banana (сокращённо -b), --cocoa (сокращённо -c), и печатает на экран значения этих параметров и значение args.
- Напишите скрипт tsv2csv.py, который получает из командной строки два имени файла: входного и выходного. Скрипт записывает в выходной файл в точности содержимое входного файла, заменяя табуляторы на запятые.
Напишите скрипт fasta2csv.py, который получает из командной строки два имени файла: входного и выходного. Скрипт читает входной файл в формате FASTA и записывает его в выходной файл в формате CSV таким образом: первая колонка – имя последовательности (всё от > до первого пробела), вторая колонка – описание последовательности (всё после первого пробела в строке с >), третий столбец – тело последовательности. Пример:
>seq86382 2:N:0: CGATAATGCATTTAAATTGGCGAAATTTTGTAAGATACTCACCCAGTCTATCACTTCGCA AGTCGTGCATTTTGACCAAGTGCAGAGGTGTACTTAATGGG >seq86348 1:Y:0: ATACCACCTATTGCAAGTCTTAATACACTTTTCCATCCTAAGAAGTGGTTTTGGGCTAGA TTTAATCTTTGTGTAAGCTGGTGCTTAAATATGAGTAAAGT
- должен преобразоваться в:
seq86382,2:N:0:,CGATAATGCATTTAAATTGGCGAAATTTTGTAAGATACTCACCCAGTCTATCACTTCGCAAGTCGTGCATTTTGACCAAGTGCAGAGGTGTACTTAATGGG seq86348,1:Y:0:,ATACCACCTATTGCAAGTCTTAATACACTTTTCCATCCTAAGAAGTGGTTTTGGGCTAGATTTAATCTTTGTGTAAGCTGGTGCTTAAATATGAGTAAAGT
- должен преобразоваться в: