Python и файлы: практические задания с решениями

Раздел: Ввод-вывод и работа с файлами -> Работа с файлами в Python

Основные подходы к работе с файлами в Python

Наиболее надёжный способ работы с файлами - использование менеджера контекста with open(...) as f. Он гарантирует автоматическое закрытие файла даже при возникновении исключений. Этот подход подходит для любых операций: чтения, записи и дозаписи.

with open('example.txt', 'w', encoding='utf-8') as f:
    f.write('Строка для записи')

задача файлы python (задачи на работу с файлами в python)

with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

Цель: безопасное управление файловыми ресурсами без ручного f.close().

Типичная ошибка: забыть указать кодировку encoding='utf-8' - в Windows может возникнуть UnicodeDecodeError.

Решение: всегда явно задавать кодировку при открытии текстового файла.

Как прочитать весь файл одной строкой?

Метод read() возвращает всё содержимое как одну строку. Подходит для небольших файлов (до десятков мегабайт).

with open('data.txt', 'r', encoding='utf-8') as f:
    data = f.read()
    print(f'Длина текста: {len(data)}')

Проблема: для файлов размером более 100 МБ может не хватить оперативной памяти.

Решение: использовать построчное чтение или чтение блоками.

Как читать файл построчно без загрузки всего в память?

Итерация по файловому объекту for line in f: обрабатывает строку за строкой. Эффективно для больших логов.

with open('big_log.txt', 'r', encoding='utf-8') as f:
    for line_number, line in enumerate(f, 1):
        if 'ERROR' in line:
            print(f'Строка {line_number}: {line.strip()}')

Ошибка: забыть удалить символ перевода строки line.strip() - в выводе останутся лишние пустые строки.

Решение: всегда использовать .strip() или .rstrip().

Как упростить работу с путями и файлами используя pathlib?

Библиотека pathlib предоставляет объектно-ориентированный интерфейс. Методы read_text() и write_text() скрывают работу с кодировками.

from pathlib import Path

file_path = Path('hello.txt')
file_path.write_text('Привет, мир!', encoding='utf-8')
print(file_path.read_text(encoding='utf-8'))

Цель: сделать код более читаемым и избежать ошибок с разделителями путей.

Проблема: pathlib не всегда доступен в очень старых версиях Python (до 3.4).

Решение: обновить Python или использовать os.path.

Как корректно читать и записывать данные в формате CSV?

Модуль csv автоматически обрабатывает экранирование кавычек и разделителей. Для записи используйте csv.writer, для чтения - csv.reader.

import csv

# Запись
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['Имя', 'Возраст'])
    writer.writerow(['Анна', 25])

# Чтение
with open('data.csv', 'r', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Типичная ошибка: не указать newline='' - в Windows появляются пустые строки между записями.

Решение: всегда передавать newline='' при работе с CSV.

Как сохранять и загружать структуры данных Python в формате JSON?

Модуль json преобразует словари и списки в строку JSON и обратно.

import json

data = {'name': 'Иван', 'age': 30, 'hobbies': ['чтение', 'спорт']}

# Запись
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

# Чтение
with open('data.json', 'r', encoding='utf-8') as f:
    loaded = json.load(f)
    print(loaded['name'])

Проблема: без ensure_ascii=False русские буквы превращаются в escape-последовательности \uXXXX.

Решение: указывать ensure_ascii=False при записи.

Как работать с бинарными данными, например, с изображениями?

Бинарные файлы открываются в режимах 'rb' (чтение) и 'wb' (запись). Данные представлены типом bytes.

# Копирование файла
with open('source.jpg', 'rb') as src:
    with open('copy.jpg', 'wb') as dst:
        dst.write(src.read())

Ошибка: случайное открытие бинарного файла в текстовом режиме ('r') - TypeError или искажение данных.

Решение: для нетекстовых данных всегда использовать бинарные режимы.

Как избежать ошибок кодировки при чтении и записи текстовых файлов?

Параметр encoding в open() задаёт кодировку. Если файл имеет другую кодировку, укажите её (например, 'cp1251').

with open('old_doc.txt', 'r', encoding='cp1251') as f:
    text = f.read()
    # конвертируем в utf-8 и сохраняем
    with open('new_doc.txt', 'w', encoding='utf-8') as f2:
        f2.write(text)

Проблема: UnicodeDecodeError при несовпадении кодировок.

Решение: определить кодировку с помощью chardet или попробовать несколько кодировок в try/except.

Как обрабатывать ошибки, такие как FileNotFoundError?

Обёртывание кода в try/except позволяет корректно реагировать на отсутствие файла или недостаток прав.

try:
    with open('missing.txt', 'r') as f:
        print(f.read())
except FileNotFoundError:
    print('Файл не найден, будет создан новый.')
    with open('missing.txt', 'w') as f:
        f.write('Автоматически созданный файл')
except PermissionError:
    print('Нет прав на чтение файла.')

Как обрабатывать файлы размером больше оперативной памяти?

Чтение фиксированными блоками (чанками) с помощью f.read(chunk_size) позволяет обработать даже гигабайтные файлы.

CHUNK_SIZE = 1024 * 1024  # 1 МБ
with open('large_file.bin', 'rb') as f:
    while True:
        chunk = f.read(CHUNK_SIZE)
        if not chunk:
            break
        # обработка chunk (например, поиск сигнатуры)
        print(f'Прочитано {len(chunk)} байт')

Расширенные примеры работы с файлами

Построчная фильтрация и запись результатов

Задача: из файла input.txt оставить только строки, содержащие слово "Python", и сохранить их в output.txt.

Пример
with open('input.txt', 'r', encoding='utf-8') as inf,
     open('output.txt', 'w', encoding='utf-8') as outf:
    for line in inf:
        if 'Python' in line:
            outf.write(line)

Результат: файл output.txt содержит только отобранные строки.

Работа с CSV: выборка по условию

Из файла employees.csv выбрать сотрудников старше 30 лет и записать в новый CSV.

Пример
import csv

with open('employees.csv', 'r', newline='', encoding='utf-8') as inf,
     open('seniors.csv', 'w', newline='', encoding='utf-8') as outf:
    reader = csv.DictReader(inf)
    fieldnames = reader.fieldnames
    writer = csv.DictWriter(outf, fieldnames=fieldnames)
    writer.writeheader()
    for row in reader:
        if int(row['age']) > 30:
            writer.writerow(row)

Результат: новый CSV-файл с отфильтрованными записями.

Чтение JSON с вложенными структурами

Файл config.json:

Пример
{
  "database": {
    "host": "localhost",
    "port": 5432
  },
  "logging": {
    "level": "DEBUG",
    "file": "app.log"
  }
}

Загрузим и выведем значение порта:

Пример
import json

with open('config.json', 'r', encoding='utf-8') as f:
    config = json.load(f)
    print(f"Порт БД: {config['database']['port']}")
Порт БД: 5432

Копирование бинарного файла блоками (эффективная буферизация)

Пример
BUFFER = 65536  # 64 КБ
with open('source.mp4', 'rb') as src:
    with open('dest.mp4', 'wb') as dst:
        while True:
            data = src.read(BUFFER)
            if not data:
                break
            dst.write(data)

Этот метод не загружает весь файл в память, что позволяет копировать файлы любого размера.

Обработка ошибок кодировки с fallback

Пример
encodings = ['utf-8', 'cp1251', 'latin-1']
for enc in encodings:
    try:
        with open('unknown.txt', 'r', encoding=enc) as f:
            content = f.read()
            print(f'Успешно прочитано в кодировке {enc}')
            break
    except UnicodeDecodeError:
        continue
else:
    print('Не удалось определить кодировку')

Результат: файл будет прочитан в первой кодировке, которая не вызвала ошибку.

Задачи на работу с файлами в Python - comments

En
задача файлы python (python)