Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
138 lines (110 sloc) 7.78 KB
title permalink
23 — Файловое дерево и форматирование строк
/23/

Связанные занятия

На прошлом занятии

  • Содержание папки
  • Работа с путями к файлам и папкам
  • Манипуляции с файлами и папками

План этого занятия

  • Обход дерева
  • Форматирование строк

Функция 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 км
до пункта Б велосипедист встретил свою
бабушку. Сколько пирожков съел велосипедист перед тем
как продолжить свой путь к Б?

Это лишь некоторые примеры форматирования строк, например мы совсем не коснулись выравнивания строк и форматированного вывода чисел. Другие примеры смотрите в справочнике уделив внимание «новому» синтаксису.

Домашняя работа

Программа должна обходить всё дерево папок, начинающееся с той папки, где она находится, и сообщать следующую информацию (далее — по вариантам): 

  1. сколько в этих папках встречается разных названий файлов без учёта расширений; 
  2. файлы с каким расширением чаще всего встречаются в этих папках (если таких несколько, можно печатать только одно); 
  3. какова максимальная глубина папки в этом дереве (глубину папки с программой нужно считать равной 0); 
  4. в скольких папках встречается хотя бы 3 файла с расширением ".pdf"; 
  5. на какую букву начинается название большинства папок (если таких несколько, можно печатать только одну); 
  6. сколько в дереве папок с полностью кириллическими названиями; 
  7. в какой папке лежит больше всего файлов.
You can’t perform that action at this time.