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('Не удалось определить кодировку')
Результат: файл будет прочитан в первой кодировке, которая не вызвала ошибку.