[ Сборник задач ]
Тема 14. Работа с файлами

[ Сборник задач ]
Тема 14. Работа с файлами

Python Workbook Cover T1
  • Операторы: file
  • Контент: Вопросы (5шт) + задачи (5шт)

Оглавление

1
Введение
Взаимодействие с файлами разных типов в Python: текст, картинки, таблицы. Разные режимы открытия документов: на чтение, запись, дозапись. Основные модули для работы с файлами.
Перейти
2
Вопросы и ответы
5 вопросов по теме "Работа с файлами" + ответы
Перейти
3
Условия задач
5 задач по теме двух уровней сложности: Базовый и *Продвинутый
Перейти
4
Решения задач
Приводим код решений указанных выше задач
Перейти
1
One

Введение

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

При работе с файлами в Python используется ряд функций и методов:
- функция open() - открывает файл для чтения, записи, добавления нового содержимого. Может принимать дополнительные параметры: для задания режима открытия, указания кодировки, вывода ошибок и др. Возвращает дескриптор файла, который обязательно нужно закрыть, иначе файл останется в памяти. Дескриптор в данном случае представляет собой путь к документу в виде строки;
- функция close() - закрывает файловый объект;
- инструкция with (позволяет автоматически закрывать файловый объект после работы с ним);
- метод read() - для чтения содержимого документа;
- метод readlines() - преобразует все строки файла в список;
- метод readline() - построчно выводит данные файла (удобно при работе с массивными документами);
- метод write() - записывает новую информацию в файл;
- функция rename() из модуля os - переименовывает документ и др.

При решении заданий потребуются следующие знания:
  1. Способы открытия файлов в разных режимах;
  2. Варианты задания кодировок;
  3. Методы чтения содержимого документов;
  4. Инструменты для записи файлов;
  5. Популярные библиотеки для работы с файлами (csv, json, Pillow и др.).

Читайте также

2
Two

Вопросы по теме "Работа с файлами"

3
Three

Задачи по теме "Работа с файлами"

Задача 1
Напишите функцию read_last(lines, file), которая будет открывать определенный файл file и выводить на печать построчно последние строки в количестве lines (на всякий случай проверим, что задано положительное целое число). Протестируем функцию на файле article.txt со следующим содержимым:

Вечерело
Жужжали мухи
Светил фонарик
Кипела вода в чайнике
Венера зажглась на небе
Деревья шумели
Тучи разошлись
Листва зеленела

Задача 2
Выберите любую папку на своем компьютере, имеющую вложенные директории. Выведите на печать в терминал ее содержимое, как и всех подкаталогов при помощи функции print_docs(directory).
Задача 3
Документ article.txt содержит следующий текст:

Вечерело
Жужжали мухи
Светил фонарик
Кипела вода в чайнике
Венера зажглась на небе
Деревья шумели
Тучи разошлись
Листва зеленела


Требуется реализовать функцию longest_words(file), которая выводит слово, имеющее максимальную длину (или список слов, если таковых несколько).
Задача 4*
Требуется создать csv-файл rows_300.csv со следующими столбцами:
- номер по порядку (от 1 до 300);
Секунда – текущая секунда на вашем ПК;
Микросекунда – текущая миллисекунда на часах.
На каждой итерации цикла искусственно приостанавливайте скрипт на 0,01 секунды.
Задача 5*
При помощи библиотеки Pillow в директории circles (создайте ее во время выполнения функции) нарисуйте и сохраните 100 кругов радиусом 300 пикселей случайных цветов в формате jpg на белом фоне (каждый круг - отдельный файл). Для этого напишите функцию circles_generator(num_of_circles=100).
4
Two

Решение

Задача 1. Базовый уровень

Условие

Напишите функцию read_last(lines, file), которая будет открывать определенный файл file и выводить на печать построчно последние строки в количестве lines (на всякий случай проверим, что задано положительное целое число). 
Протестируем функцию на файле «article.txt» со следующим содержимым:

Вечерело
Жужжали мухи
Светил фонарик
Кипела вода в чайнике
Венера зажглась на небе
Деревья шумели
Тучи разошлись
Листва зеленела
Так как дополнительные символы показывать нам не требуются (переносы строк), выводить их на печать не будем.
Решение - IDE

def read_last(lines, file):
    if lines > 0:
        with open(file, encoding='utf-8') as text:
            file_lines = text.readlines()[-lines:]
        for line in file_lines:
            print(line.strip())
        else:
            print('Количество строк может быть только целым положительным')

 
# Тесты
read_last(3, 'article.txt')
read_last(-5, 'article.txt')
Результат выполнения

Деревья шумели
Тучи разошлись
Листва зеленела
Количество строк может быть только целым положительным
Теперь данную библиотеку может скачать любой пользователь и без проблем импортировать ее в свой проект, получив легкий и удобный доступ к 6-ти созданным нами функциям.

Задача 2. Базовый уровень

Условие

Выберите любую папку на своем компьютере, имеющую вложенные директории. 
Выведите на печать в терминал ее содержимое, как и всех подкаталогов при помощи функции print_docs(directory).
Проход по все каталогам и файлам в определенной директории можно осуществить при помощи функции walk() модуля os. Для примера возьмем следующую папку: C:/Program Files/Classic Shell.
Решение - IDE

import os
 
def print_docs(directory):
	all_files = os.walk(directory)
	for catalog in all_files:
        print(f'Папка {catalog[0]} содержит:')
        print(f'Директории: {", ".join([folder for folder in catalog[1]])}')
        print(f'Файлы: {", ".join([file for file in catalog[2]])}')
        print('-' * 40)
 
 
print_docs('C:/Program Files/Classic Shell')
Результат выполнения

Папка C:/Program Files/Classic Shell содержит:
Директории: Skins
Файлы: ClassicExplorer32.dll, ClassicExplorer64.dll, ClassicExplorerSettings.exe, ClassicIEDLL_32.dll, …
----------------------------------------
Папка C:/Program Files/Classic Shell/Skins содержит:
Директории:
Файлы: Classic Skin.skin, Classic Skin.skin7, …

Задача 3. Базовый уровень

Условие

Документ «article.txt» содержит следующий текст:

Вечерело
Жужжали мухи
Светил фонарик
Кипела вода в чайнике
Венера зажглась на небе
Деревья шумели
Тучи разошлись
Листва зеленела 

Требуется реализовать функцию longest_words(file), которая выводит слово, имеющее максимальную длину (или список слов, если таковых несколько).
 
Сначала извлечем всё содержимое документа, а потом найдем слова с максимальным количеством символов.
Решение - IDE

def longest_words(file):
    with open(file, encoding='utf-8') as text:
        words = text.read().split()
        max_length = len(max(words, key=len))
        sought_words = [word for word in words if len(word) == max_length]
        if len(sought_words) == 1:
            return sought_words[0]
        return sought_words
 
 
print(longest_words('article.txt'))
Результат выполнения

разошлись

Задача 4. Продвинутый уровень

Условие

Требуется создать csv-файл «rows_300.csv» со следующими столбцами:
– № - номер по порядку (от 1 до 300);
– Секунда – текущая секунда на вашем ПК;
–  Микросекунда – текущая миллисекунда на часах.
На каждой итерации цикла искусственно приостанавливайте скрипт на 0,01 секунды.
Для работы с файлами подобного текстового формата потребуется встроенная в Python библиотека csv.
Решение - IDE

import csv
import datetime
import time
 
with open('rows_300.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['№', 'Секунда ', 'Микросекунда'])
    for line in range(1, 301):
        writer.writerow([line, datetime.datetime.now().second, datetime.datetime.now().microsecond])
        time.sleep(0.01)
 
В итоге создастся требуемый файл. Приведем первые строки его содержимого:
Содержимое файла rows_300.csv

№,Секунда ,Микросекунда
1,51,504807
2,51,515807
3,51,526819
4,51,537817
5,51,548800
6,51,558817
…

Задача 5. Продвинутый уровень

Условие

При помощи библиотеки Pillow в директории circles (создайте ее во время выполнения функции) нарисуйте и сохраните 100 кругов радиусом 300 пикселей случайных цветов в формате jpg на белом фоне (каждый круг - отдельный файл). Для этого напишите функцию circles_generator(num_of_circles=100).
В первую очередь требуется установка модуля Pillow:
Консоль

$ pip install Pillow

Осталось только случайным образом генерировать цвета в палитре RGB и воспользоваться классами Image, ImageDraw из установленной библиотеки. Чтобы нарисовать круг, нужно применить метод ellipse() и задать координаты точек, соответствующие квадрату.
Решение - IDE

from random import randint
import os
from PIL import Image, ImageDraw
 
 
def circles_generator(num_of_circles=100):

    if not os.path.exists('circles'):
        os.mkdir('circles')

    for pic_name in range(1, num_of_circles + 1):
        img = Image.new('RGB', (600, 600), (255, 255, 255))
        draw = ImageDraw.Draw(img)
        draw.ellipse((0, 0, 600, 600), fill=(randint(0, 255), randint(0, 255), randint(0, 255)))
        img.save(f'circles/{pic_name}.jpg', quality=85)
 
 
circles_generator()
В результате выполнения скрипта в папке circles появится 100 картинок кругов одинакового размера. При повторном вызове программы ошибки не будет, так как мы создаем папку лишь в том случае, если ее нет.
Как вам материал?

Читайте также