Работа с файлами
План рассказа
- hg tag
- Файлы:
- open (r,w)
- for
- read, write
- stdin, stdout, stderr
- полезности строк:
- strip, split, partition, lstrip, rstrip
- конструкторы встроенных типов для разбора строк
- optparse (default, action="store_true", type)
Заготовка программы
1 #!/usr/bin/python
2 """A script for doing STUFF.
3
4 STUFF is just something I made up right now.
5 """
6 import optparse
7 import doctest
8 import sys
9 # import'ы модулей (если нужно)
10
11 # определения констант (если нужно)
12
13 # определения функций (если нужно)
14
15 # определения классов (если нужно)
16
17 if __name__ == "__main__":
18 parser = optparse.OptionParser(description=__doc__)
19 parser.add_option("-x", "--quantity",
20 help="Quantity of STUFF")
21 # ... --quantity -- это пример;
22 # его можно стереть и написать своих параметров по его образу и подобию
23 parser.add_option("-v", "--verbose", action="store_true",
24 help="Be more noisy")
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(verbose=options.verbose)
31 print "%s failed of %s tests" % (failed, tests)
32 sys.exit(failed != 0)
33
34 # основные команды скрипта (лучше всего, вызов головной функции)
Задание
Задание крайне важное, но не сложное. Если вы не успеете выполнить его к 20-му числу, у вас есть хорошие шансы не получить зачёт (не потому, что я такой злой, а по опыту).
Договоритесь, к какой команде вы принадлежите. К вашей команде должно принадлежать 2 – 5 человек. (1 человек – не годится; 6 и более – замучаетесь сами и меня замучаете).
- Сочините для себя зачётное задание соразмерно вашим способностям и вашим интересам. Если ничего не приходит в голову, выберите какое-нибудь из предложенных мной или посоветуйтесь со мной.
- Напишите для зачётного задания ТЗ.
- Напишите для зачётного задания план реализации.
На странице ../Projects лежит список заданий, которые я сочинил, вдохновляющие мысли о том, как писать ТЗ и план реализации, требования к зачёту.
ТЗ и план реализации должны быть написаны на вики, в соответствующей подстранице страницы ../Projects. (Для тех, кто пропустил рассказ про вики, в этом всё равно нет ничего сложного, и я помогу).
В этом семестре я готов взять на себя почти всю работу менеджера проекта (помочь составить ТЗ и план реализации), но инициатива должна исходить от вас.
Советую обращаться ко мне за помощью в самом начале. Я почти всегда обитаю в к. 321 корпуса "А" после двух часов дня.
Упражнения
Упражнения выполнять не обязательно для зачёта, но полезно, чтобы все нужные навыки уложились в голову. Выбирайте любые упражнения: какие вам проще или какие интереснее, или никакие вообще. И, разумеется, решайте упражнения в любом порядке.
Результаты решения упражнений должны оказываться в вашем репозитории. (И более того, в его копии на сервере).
Упражнения, помеченные (*), сложнее.
Напишите скрипт sum.py, который получает с командной строки имя файла, в котором записаны числа, по одному числу на строку, и распечатывает их сумму.
- (*) Сделайте так, чтобы этот скрипт работал в духе старых утилит UNIX, а именно:
- если ему не дали аргументов, он ожидает содержимое файла со стандартного ввода;
- если ему дали несколько аргументов, он суммирует содержимое каждого из файлов, данных в аргументах;
- если в качестве очередного имени аргумента ему дали "-", он ожидает в этом месте содержимое файла со стандартного ввода
Напишите скрипт cat.py, который пишет на стандартный вывод всё то, что ему пишут на стандартный ввод
Напишите скрипт tac.py, который получает с командной строки имя файла, и распечатывает строки этого файла в обратном порядке
- (*) Сделайте так, чтобы этот скрипт работал в духе старых утилит UNIX (аналогично 1.b)
Напишите скрипт fixblast.py, который получает с командной строки имя файла, содержащего выдачу blast с параметром -m9 (т.е. с большим количеством лишних строк, начинающихся с #); скрипт печатает на стандартный вывод содержимое этого файла с одной строкой заголовка в начале (т.е. находит первый содержательный заголовок и печатает его, затем печатает все строки, не начинающиеся с #)
Доделайте (упростите) этот скрипт так, чтобы он выдавал текст с одной строкой заголовка, получая на вход выдачу blast с одной строкой заголовка
- Аналогично 1.b и 3.b