-
1. Введение в Python
2. Условия и операторы сравнения
3. Циклы и индексы
4. Списки
5. Файлы
6. Запись файлов
7. Введение в функции
8. Продолжение функций, кортежи
9. Подготовка к контрольной работе №1
11. Импорт и функции
12. Словари 1 и множества
13. Словари 2
14. Словари 3
15. Регулярные выражения 1
16. Регулярные выражения 2
17. Регулярные выражения 3
20. Работа с файлами и папками
21. Файловое дерево и форматирование строк
Содержание
- Обход дерева
- Форматирование строк
Функция walk модуля os позволяет обходить все папки, начиная с заданной, и получать на каждой итерации списки всех файлов и папок на этом уровне. См. документацию: os.walk
>>> start_path = '.'
>>> for root, dirs, files in os.walk(start_path):
... print('Где мы сейчас:', root)
... print('Папки на этом уровне:', dirs)
... print('Файлы на этом уровне:', files)
Начальная директория может обозначаться абсолютным путём (например, r’C:\user\docs’) или относительным (‘./images/’). Подробнее про абсолютные и относительные пути, например, здесь.
Обратите внимание, что одна точка обозначает текущую директорию:
>>> start_path = "."
>>> print("Что здесь есть:", os.listdir(start_path))
Две точки обозначают родительский каталог:
>>> print("На уровень выше:", os.listdir(".."))
>>> print("А в подпапке docs", os.listdir("../docs/"))
Пользуясь os.walk(), не забывайте, что на каждой итерации в переменных dirs и files — обыкновенные списки строк, и элементы этих списков — имена папок/файлов (с расширениями), а не пути к ним. Например, чтобы открыть один из этих файлов, нужно склеить адрес и название файла с помощью os.path.join().
Форматирование строк
Форматирование строк — это способ презентации данных в виде строковой переменной.
На настоящий момент в Питоне существует целых три синтаксиса для форматирования, но мы будем использовать только синтаксис с использованием метода строк .format(), оставив «старый» синтаксис с оператором % и самый новый с использованием «f-строк» в стороне.
Базовый пример
Метод строк .format() заменяет фигурные скобки в строке, к которой применён, на строковое представление своих аргументов:
>>> x = 1
>>> s1 = str(x)
>>> s2 = '{}'.format(x)
>>> s1 == s2
True
>>> print('x = {}'.format(x))
x = 1
Если фигурных скобок несколько, то у метода .format() должно быть соответствующее число аргументов:
>>> x = 26
>>> y = 2
>>> print('{} / {} = {}'.format(x, y, x // y))
26 / 2 = 13
В фигурных скобках можно указать номер аргумента, начинаю с нуля:
>>> name = 'Алиса'
>>> day = 22
>>> s = '''Здраствуйте, {0}.
... Только по промокоду "{0}{1}" {1} апреля 2019 года
... вы сможете приобрести гантели в количестве {1} шт.
... по цене одной!'''.format(name, day)
>>> print(s)
Здраствуйте, Алиса.
Только по промокоду "Алиса22" 22 апреля 2019 года
вы сможете приобрести гантели в количестве 22 шт.
по цене одной!
Для удобства, вместо номеров можно использовать имена аргументов (они не обязаны совпадать с именами переменных, но часто это удобно):
>>> city1 = 'А'
>>> city2 = 'Б'
>>> driver = 'велосипедист'
>>> velocity = 22
>>> x = 10.52
>>> s = '''Из пункта {departure} в пункт {destination}
... выехал {driver} со скоростью {v} км/ч. За {x} км
... до пункта {destination} {driver} встретил свою
... бабушку. Сколько пирожков съел {driver} перед тем
... как продолжить свой путь к {destination}?
... '''.format(
... departure=city1,
... destination=city2,
... driver=driver,
... x=x,
... v=velocity,
... )
... print(s)
Из пункта А в пункт Б
выехал велосипедист со скоростью 22 км/ч. За 10.52 км
до пункта Б велосипедист встретил свою
бабушку. Сколько пирожков съел велосипедист перед тем
как продолжить свой путь к Б?
Это лишь некоторые примеры форматирования строк, например мы совсем не коснулись выравнивания строк и форматированного вывода чисел. Другие примеры смотрите в справочнике уделив внимание «новому» синтаксису.
Домашняя работа
Программа должна обходить всё дерево папок, начинающееся с той папки, где она находится, и сообщать следующую информацию (далее — по вариантам):
- сколько в этих папках встречается разных названий файлов без учёта расширений;
- файлы с каким расширением чаще всего встречаются в этих папках (если таких несколько, можно печатать только одно);
- какова максимальная глубина папки в этом дереве (глубину папки с программой нужно считать равной 0);
- в скольких папках встречается хотя бы 3 файла с расширением “.pdf”;
- на какую букву начинается название большинства папок (если таких несколько, можно печатать только одну);
- сколько в дереве папок с полностью кириллическими названиями;
- в какой папке лежит больше всего файлов.