Модуль os: работа с файловой системой

В этих задачах вам будет поставлена какая-то проблема, которую необходимо решить. Вам необходимо сдать на проверку программу, решающую данную задачу, а в конце кода программы в виде многострочного комментария написан ответ на эту задачу. Многострочные комментарии в Python отделяются строками, содержащими три двойные кавычки перед и после комментария. Пример такой программы:

print(2 ** 100)
"""
1267650600228229401496703205376
"""

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

Каталог Primates из архива нужно распаковать куда-нибудь. Ваша программа должна быть сохранена в каталоге, внутри которого находится каталог Primates. Например, ваша программа может содержать вызов os.chdir("Primates") в этот каталог. Например, если путь к распакованному архиву имеет вид C:\Users\Ivan\179\progr\Primates, то ваша программа должна лежать в каталоге C:\Users\Ivan\179\progr.

При этом запрещается использовать абсолютные пути в именах каталогов, ваша програма может быть запущена из любого каталога, в котором есть подкаталог Preimates.

В тексте программы рекомендуется использовать прямой слеш (“/”) для разделения каталогов. В выводе вашей программы могут быть как прямые, так и обратные слеши.

A: Список файлов

Перейдите в каталог Primates/Haplorrhini/Simiiformes/Platyrrhini/Callitrichinae. Выведите список всех файлов в этом каталоге, упорядоченных в лексикографическом порядке. Имена вложенных подкаталогов выводить не нужно.

Для того, чтобы отличить строку с именем файла от строки с именем подкаталога можно использовать функции os.path.isfile или os.path.isdir или воспользоваться тем, что в этом архиве все файлы имеют расширение .txt.

import os
os.chdir("Primates")
# ...
# ...
"""
Galeopithecidae.txt
"""

B: Перемещаемся по каталогам

Начнём с каталога Primates. В нём два подкаталога: Haplorrhini и Strepsirrhini. Перейдём в подкаталог, имя которого будет наименьшим в лексикографическом порядке. В этом каталоге есть два подкаталога, перейдём в подкаталог с меньшим именем в лексикографическом порядке Simiiformes и т.д. Мы остановимся в каталоге, в котором не будет подкаталогов, а будут только файлы. Возьмите файл с наименьшем именем в лексикографическом порядке и выведите полный путь к этому файлу, то есть строку, которая начинается с Primates/Haplorrhini/Simiiformes/.

Например, если бы наша программа начала с каталога Primates/Strepsirrhini/Lorisiformes, то ответ был бы таким:

Lorisiformes/Galagidae/Euoticus/Euoticus_elegantulus.txt

Указание. Напишите рекурсивную функцию, которая строит список подкаталогов данного каталога, находит из них наименьший и рекурсивно вызывается из него.

C: Поиск файла

Найдите файл с именем Homo_sapiens.txt. В каждом текстовом файле записана одна строка: идентификатор таксона в Open Tree of Life. Выведите номер таксона Homo sapiens.

Например, если бы требовалось найти файл Paleopropithecidae.txt (см. следующее задание), то ответ был бы

ott5827927

Указание. Напишите функцию, которая рекурсивно будет запускаться от всех своих подкаталогов. Если вы пишете рекурсивную фукнцию, то после рекурсивного вызова нужно возвращаться в родительский каталог при помощи os.chdir("..").

Другой вариант решения задачи: воспользоваться функцией os.walk.

D: Поиск файла - 2

Найдите файл с именем Homo_sapiens.txt. Напечатайте полный путь к нему, начиная с каталога Primates, то есть ответ должен иметь вид

Primates/ ... /Homo_sapiens.txt

Например, если бы требовалось найти файл Paleopropithecidae.txt, то ответ был бы

Primates/Strepsirrhini/Lemuriformes/Paleopropithecidae.txt

E: Список всех файлов

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

Например, если исходным каталогом был бы Primates/Haplorrhini/Simiiformes/Platyrrhini/Pitheciidae/Pitheciinae/Cacajao, то ответ был бы таким:

Cacajao_ayresi.txt
Cacajao_calvus_calvus.txt
Cacajao_calvus_novaesi.txt
Cacajao_calvus_rubicundus.txt
Cacajao_calvus_ucayalli.txt
Cacajao_hosomi.txt
Cacajao_melanocephalus.txt
Cacajao_rubicundus.txt

F: Список всех каталогов

Выведите список всех вложенных подкаталогов для каталога Primates, всех их подкаталогов, в виде дерева. Дерево начинается с самого каталога Primates. Для каждого подкаталога выводится его имя с путём до него, а затем — всё его содержимое таким же образом. Содержимое каждого каталога упорядочивается лексикографически.

Например, если бы максимальная глубина вложенности каталогов была бы равна 2 (не считая каталога Primates), то ответ был бы таким:

Primates
Primates/Haplorrhini
Primates/Haplorrhini/Simiiformes
Primates/Haplorrhini/Tarsiiformes
Primates/Strepsirrhini
Primates/Strepsirrhini/Chiromyiformes
Primates/Strepsirrhini/Lemuriformes
Primates/Strepsirrhini/Lorisiformes

G: Наибольшее число файлов

Найдите каталог, в котором находится наибольшее число файлов (без учёта файлов во вложенных подкаталогах). Такой каталог будет один. Выведите полный путь до этого каталога.

Например, если в качестве начального каталога взять Primates/Haplorrhini/Simiiformes/Platyrrhini/Atelidae, то ответ был бы таким

Atelidae/Alouattinae/Alouatta

H: Список всех таксонов

В каждом файле архива находится текстовая строка: идентификатор этого таксона в open tree of life. Выведите список этих таксонов, упорядочив их в лексикографическом порядке.

Например, если бы стартовым был каталог Primates/Strepsirrhini/Lorisiformes/Lorisidae, то ответ был бы

ott101793
ott1049685
ott1049687
ott323051
ott323063
ott339042
ott4941439
ott673365
ott673376
ott946857
ott946859
ott946861