Язык программирования Python

Курс IT-Академии Сухорукова

Май-июль 2019

Следующее занятие

25 июня в 19:00 NOVT

Задание. Создание модуля

Есть папка с текстовыми файлами — «библиотека» (в смысле, книжная библиотека). Разработаем набор базовых функций для работы с этой библиотекой и оформим этот набор в виде модуля.

Данные для работы

Библиотека представляет собой папку с текстовыми файлами. Эти текстовые файлы представлены в особом формате. Расширение имени файла с книгой — .txt. Например, pushkin_skazka_o_tsare.txt. Любые другие файлы игнорируются. Все книги библиотеки лежат в одной папке. Имя папки заранее неизвестно.

Каждая книга — текстовый файл в кодировке UTF-8. Первая строка файла — имя автора. Вторая строка — название книги. Третья строка — аннотация. Начиная с четвёртой строки и до конца файла идёт текст книги.

Кроме того, в каталоге может лежать специальный файл с именем description.txt. Этот файл не является книгой и содержит описание библиотеки. Это так же текстовый файл в кодировке UTF-8. Соответственно, этот файл нужно игнорировать и обращаться к нему только если запрошено описание библиотеки.

Скачайте пример папки с библиотекой в виде архива.

Интерфейс модуля

Работа с библиотекой должна производиться следующими функциями.

Во всех функциях модуля первый параметр library_dir – это имя папки с библиотекой.

read_library_description

Формат функции:

read_library_description(library_dir)

Функция находит в папке с библиотекой файл description.txt и возвращает содержание этого файла. Если файла нет или его невозможно прочитать, возвращает пустую строку (то есть необходимо предусмотреть обработку ошибок чтения файла).

get_book_files

Формат функции:

get_book_files(library_dir)

Функция возвращает список имён файлов книг в указанной папке. Имена должны быть относительными, не абсолютными. Файл description.txt нужно проигнорировать, то есть даже если он присутствует, в возвращённом списке его быть не должно. Например, если в папке лежали файлы:

  • ali-baba-i-40.txt
  • description.txt
  • skazki.txt
  • vinni-pooh.doc
  • zimovie.doc

Функция должна вернуть следующий результат:

[
    "ali-baba-i-40.txt",
    "skazki.txt"
]

При невозможности получения списка файлов следует вернуть пустой список.

read_book_info

Формат функции:

read_book_info(library_dir, book_file)

Параметры:

  • library_dir – папка библиотеки
  • book_file – имя файла с книгой

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

Например, если файл Arap_Petra_Velikogo.txt начинается так:

Александр Сергеевич Пушкин
Арап Петра Dеликого 
Аннотация: Александр Пушкин. Арап Петра Великого

 Железной волею Петра 
 Преображенная Россия.
    Н. Языков.

 ГЛАВА I

 Я в Париже; 
 Я начал жить, а не дышать.

То функция read_book_info(library_dir, "Arap_Petra_Velikogo.txt") должна вернуть такой результат:

(
    "Александр Сергеевич Пушкин",
    "Арап Петра Dеликого",
    "Аннотация: Александр Пушкин. Арап Петра Великого"
)

Необходимо (!) предусмотреть обработку ошибок чтения файла:

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

get_authors

Формат функции:

get_authors(library_dir)

Функция возвращает список имён авторов, книги которых есть в библиотеке. Имена в списке не должны повторяться, конечно. Для этого придётся пройти по списку файлов книг и прочитать имя автора из каждой книги. Например, для имеющегося в наличии примера результат должен быть такой:

["Александр Сергеевич Пушкин", "Николай Васильевич Гоголь"]

Если что-то идёт не так, следует вернуть пустой список.

get_all_books_info

Формат функции:

get_all_books_info(library_dir)

Эта функция возвращает список книг в данной папке, причём каждая книга представлена в виде кортежа (автор, название, аннотация, имя файла). То есть она объединяет работу функций get_book_files и read_book_info.

Оформление

Все функции следует поместить в модуль library_dir.py. К каждой функции желательно написать документацию.

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