Простой Python — страница 36 из 66

2. Создайте скелет сайта с помощью веб-сервера Flask. Убедитесь, что сервер начинает свою работу по адресу Localhost на стандартном порте 5000. Если ваш компьютер уже использует порт 5000 для чего-то еще, воспользуйтесь другим портом.

3. Добавьте функцию home() для обработки запросов к домашней странице. Пусть она возвращает строку It's alive!.

4. Создайте шаблон для jinja2, который называется home.html и содержит следующий контент:

It's alive!

I'm of course referring to {{thing}}, which is {{height}} feet tall and {{color}}.

5. Модифицируйте функцию home() вашего сервера, чтобы она использовала шаблон home.html. Передайте ей три параметра для команды GET: thing, height и color.

Глава 10. Системы

Есть одна вещь, которую может делать компьютер, но не может большинство людей, — они могут быть запечатаны в картонной коробке и лежать на складе.

Джек Хэнди

Каждый день, когда вы используете компьютер, вы выводите в виде списка на экран содержимое каталогов, создаете и удаляете файлы и выполняете другую необходимую работу, даже если это не очень захватывает. Вы также можете выполнить эти (и другие) задачи с помощью программ, написанных на Python. Сможет ли эта сила свести вас с ума или заставить потерять сон? Поживем — увидим.

Python предоставляет множество системных функций, содержащихся в модуле os (сокращение от Operating System — операционная система), который мы будем импортировать для большинства программ этой главы.

Файлы

Python, как и многие другие языки, создал свои файловые операции по шаблону Unix. Некоторые функции вроде chown() и chmod() имеют такие же имена, но при этом появились и некоторые новые функции.

Создаем файл с помощью функции open()

В разделе «Ввод информации в файлы и ее вывод из них» главы 8 вы познакомились с функцией open(). В этом разделе также содержалась информация о том, как использовать ее для открытия файла или его создания, если он не существует. Создадим текстовый файл, который называется oops.txt:

>>> fout = open('oops.txt', 'wt')

>>> print('Oops, I created a file.', file=fout)

>>> fout.close()

После этого выполним несколько проверок.

Проверяем существование файла с помощью функции exists()

Для того чтобы убедиться, что файл или каталог действительно существуют, а не являются плодом вашего воображения, можете воспользоваться функцией exists(), передав ей относительное или абсолютное имя файла, как показано здесь:

>>> import os

>>> os.path.exists('oops.txt')

True

>>> os.path.exists('./oops.txt')

True

>>> os.path.exists('waffles')

False

>>> os.path.exists('.')

True

>>> os.path.exists('..')

True

Проверяем тип с помощью функции isfile()

Функции, показанные в этом разделе, проверяют, ссылается ли имя на файл, каталог или символьную ссылку (см. примеры, которые располагаются после описания ссылок).

Первой мы рассмотрим функцию isfile(). Она задает простой вопрос: перед нами находится старый добрый законопослушный файл?

>>> name = 'oops.txt'

>>> os.path.isfile(name)

True

Вот так можно определить папку:

>>> os.path.isdir(name)

False

Одна точка (.) является сокращением для текущей папки, а две точки (..) — для родительской. Эти папки существуют всегда, поэтому следующее выражение вернет результат True:

>>> os.path.isdir('.')

True

Модуль os содержит множество функций, работающих с путем к файлу (полное имя файла, которое начинается с символа / и включает все каталоги). Одна из таких функций, isabs(), определяет, является ли аргумент абсолютным путем. Аргумент не обязательно должен быть именем реально существующего файла:

>>> os.path.isabs(name)

False

>>> os.path.isabs('/big/fake/name')

True

>>> os.path.isabs('big/fake/name/without/a/leading/slash')

False

Копируем файлы с помощью функции copy()

Функция copy() находится в другом модуле, shutil. В этом примере файл oops.txt копируется в файл ohno.txt:

>>> import shutil

>>> shutil.copy('oops.txt', 'ohno.txt')

Функция shutil.move() копирует файл, а затем удаляет оригинал.

Изменяем имена файлов с помощью функции rename()

Эта функция соответствует своему названию. В этом примере файл ohno.txt переименовывается в ohwell.txt:

>>> import os

>>> os.rename('ohno.txt', 'ohwell.txt')

Создаем ссылки с помощью link() или symlink()

В операционных системах семейства Unix файл существует в одном месте, но может иметь несколько имен, которые называются ссылками. Среди низкоуровневых жестких ссылок найти все имена заданного файла не так уж легко. Символьная ссылка позволяет вам получить одновременно оба имени — оригинальное и новое. Вызов link() создает жесткую ссылку, а symlink() — символьную ссылку. Функция islink() проверяет, является ли файл символьной ссылкой.

Вот так можно создать жесткую ссылку на существующий файл oops.txt из нового файла yikes.txt:

>>> os.link('oops.txt', 'yikes.txt')

>>> os.path.isfile('yikes.txt')

True

Для того чтобы создать символьную ссылку на существующий файл oops.txt из нового файла jeepers.txt, используйте следующий код:

>>> os.path.islink('yikes.txt')

False

>>> os.symlink('oops.txt', 'jeepers.txt')

>>> os.path.islink('jeepers.txt')

True

Изменяем разрешения с помощью функции chmod()

В системах Unix функция chmod() изменяет разрешение на использование файла. Можно задать возможность читать, записывать и выполнять файл для пользователя (обычно для вас, если файл создавали вы), основной группы, в которой находится пользователь, и остального мира. Команда принимает сильно сжатое восьмеричное значение (в системе счисления с основанием 8), которое содержит в себе информацию о пользователе, группе и другие разрешения. Например, для того чтобы указать, что файл oops.txt доступен только для чтения своему владельцу, введите следующий код:

>>> os.chmod('oops.txt', 0°400)

Если вы не хотите работать с таинственными восьмеричными значениями и вам приятнее работать с непонятными (немного) таинственными символами, можете импортировать некоторые константы из модуля stat и использовать выражение, аналогичное следующему:

>>> import stat

>>> os.chmod('oops.txt', stat.S_IRUSR)

Изменение владельца файла с помощью функции chown()

Эта функция также характерна для систем Unix/Linux/Mac. Вы можете изменить владельца и/или группу, указав числовой идентификатор пользователя ID (uid) и идентификатор группы (gid):

>>> uid = 5

>>> gid = 22

>>> os.chown('oops', uid, gid)

Получаем pathname с помощью функции abspath()

Эта функция расширяет относительное имя до абсолютного. Если вы находитесь в папке /usr/gaberlunzie, в которой лежит файл oops.txt, то можете воспользоваться следующим кодом:

>>> os.path.abspath('oops.txt')

'/usr/gaberlunzie/oops.txt'

Получаем символьную ссылку с помощью функции realpath()

В одном из предыдущих разделов мы создавали символьную ссылку на файл oops.txt из нового файла jeepers.txt. При похожих обстоятельствах вы можете получить имя файла oops.txt из файла jeepers.txt с помощью функции realpath(), как показано здесь:

>>> os.path.realpath('jeepers.txt')

'/usr/gaberlunzie/oops.txt'

Удаляем файл с помощью функции remove()

В этом сниппете мы используем функцию remove() и попрощаемся с файлом oops.txt:

>>> os.remove('oops.txt')

>>> os.path.exists('oops.txt')

False

Каталоги

В большинстве операционных систем файлы существуют в рамках иерархии каталогов (иначе их еще называют папками). Контейнером для всех этих файлов и каталогов служит файловая система (иногда ее называют томом). Стандартный модуль os работает с такими особенностями и предоставляет функции, с помощью которых вы можете ими манипулировать.

Создаем каталог с помощью функции mkdir()

В этом примере показывается, как создать каталог poems, в котором мы сохраним предыдущее стихотворение:

>>> os.mkdir('poems')

>>> os.path.exists('poems')

True

Удаляем каталог с помощью функции rmdir()

Немного подумав, вы решили, что этот каталог вам не нужен. Удалить его можно вот так:

>>> os.rmdir('poems')

>>> os.path.exists('poems')

False

Выводим на экран содержимое каталога с помощью функции listdir()

О’кей, дубль два: снова создадим файл poems и что-нибудь в него запишем:

>>> os.mkdir('poems')

Теперь получим список всех файлов, содержащихся в этом каталоге (которых пока нет):

>>> os.listdir('poems')

[]

Далее создадим подкаталог:

>>> os.mkdir('poems/mcintyre')

>>> os.listdir('poems')

['mcintyre']

Создайте в подкаталоге файл (не вводите все эти строки, если только не хотите почувствовать себя поэтом, просто убедитесь, что закрыли все одинарные или тройные кавычки):

>>> fout = open('poems/mcintyre/the_good_man', 'wt')

>>> fout.write('''Cheerful and happy was his mood,

… He to the poor was kind and good,

… And he oft' times did find them food,

… Also supplies of coal and wood,

… He never spake a word was rude,

… And cheer'd those did o'er sorrows brood,

… He passed away not understood,

… Because no poet in his lays

… Had penned a sonnet in his praise,

… 'Tis sad, but such is world's ways.

… ''')

344

>>> fout.close()

Наконец, проверим, что у нас получилось. Лучше бы ему там быть:

>>> os.listdir('poems/mcintyre')

['the_good_man']

Изменяем текущий каталог с помощью функции chdir()

С помощью этой функции вы можете переходить из одной папки в другие. Покинем текущую папку и проведем немного времени в каталоге poems:

>>> import os

>>> os.chdir('poems')

>>> os.listdir('.')

['mcintyre']

Перечисляем совпадающие файлы с помощью функции glob()

Функция glob() ищет совпадающие имена файлов или каталогов с помощью правил оболочки системы Unix, а не более полного синтаксиса регулярных выражений. Эти правила выглядят так:

• * — совпадает со всем (в регулярных выражениях аналогом этого правила является.*);

•? — совпадает с одним символом;

• [abc] — совпадает с символами a, b или c;

• [!abc] — совпадает со всеми символами, кроме a, b или c.

Получим все файлы и каталоги, имена которых начинаются с буквы m:

>>> import glob

>>> glob.glob('m*')

['mcintyre']

Как насчет файлов и каталогов с именами, состоящими из двух символов?

>>> glob.glob('??')

[]

Я думаю о слове из восьми букв, которое начинается с m и заканчивается на e:

>>> glob.glob('m??????e')

['mcintyre']

Как насчет чего-то, что начинается с букв k, l или m и заканчивается на букву e?

>>> glob.glob('[klm]*e')

['mcintyre']

Программы и процессы