Чтение и запись файлов в Python: режимы, кодировки и лучшие практики

Чтение и запись файлов в Python: режимы, кодировки и лучшие практики
Работа с файлами — одна из первых реальных задач в Python. В этой статье вы научитесь уверенно выполнять чтение и запись файлов в Python, разберёте режимы открытия, кодировки (включая UTF-8), большие файлы и частые ошибки. Материал отлично подходит под запрос «чтение и запись файлов в Python».
Пути и подготовка окружения
Советуем использовать модуль pathlib
: он кроссплатформенный и удобный для манипуляций с путями и файлами.
from pathlib import Path
base = Path("data")
base.mkdir(exist_ok=True)
path = base / "input.txt"
path.write_text("Привет, файл!\nВторая строка.", encoding="utf-8")
print(path.resolve()) # Абсолютный путь
Режимы открытия файлов в open()
- "r" — чтение (по умолчанию), ошибка если файла нет
- "w" — запись с перезаписью содержимого
- "a" — дозапись в конец
- "x" — запись, но только если файл не существует
- "b" — бинарный режим (добавляйте к вышеуказанным, например "rb")
- "+" — чтение и запись (например, "r+", "w+")
Для текста всегда явно задавайте encoding="utf-8"
, чтобы избежать проблем на разных системах.
Чтение файлов в Python: практические способы
Классический и безопасный вариант — использовать with open(...):
для автоматического закрытия файла. Вот несколько приёмов.
Прочитать весь файл целиком
with open("data/input.txt", "r", encoding="utf-8") as f:
text = f.read()
print(text)
print("Длина:", len(text))
Так удобно для небольших файлов. Для больших лучше читать построчно.
Построчное чтение без загрузки в память
with open("data/input.txt", "r", encoding="utf-8") as f:
for i, line in enumerate(f, start=1):
print(f"{i:02d}: {line.rstrip()}")
Итерация по файлу читает его потоково и экономит память — идеальна для логов и больших данных.
Чтение частями (чанками)
size = 1024 * 64 # 64 КБ
with open("data/big.txt", "r", encoding="utf-8", errors="replace") as f:
while chunk = f.read(size):
# Обрабатываем chunk
pass
errors="replace"
защитит программу от «битых» символов, подставляя заменители вместо ошибки декодирования.
Запись файлов в Python: перезапись и дозапись
Перезапись файла (режим w)
lines = ["Alice,100\n", "Bob,200\n"]
with open("out/report.txt", "w", encoding="utf-8", newline="") as f:
f.writelines(lines)
print("Файл перезаписан.")
newline=""
полезен для предсказуемых переводов строк, особенно в Windows и при работе с csv
.
Дозапись в конец (режим a)
with open("out/report.txt", "a", encoding="utf-8") as f:
f.write("Charlie,300\n")
Запрет перезаписи (режим x)
try:
with open("out/unique.txt", "x", encoding="utf-8") as f:
f.write("Создан впервые")
except FileExistsError:
print("Файл уже существует — не перезаписываем.")
Кодировки: UTF-8, BOM и ошибки
- По умолчанию используйте UTF-8:
encoding="utf-8"
. - Если файл с BOM (например, из Excel), для чтения можно указать
utf-8-sig
. - При проблемах с символами добавляйте
errors="ignore"
илиerrors="replace"
.
with open("data/weird.txt", "r", encoding="utf-8", errors="replace") as f:
print(f.read())
Бинарные файлы: изображения и копирование
buffer = 64 * 1024
with open("image.jpg", "rb") as src, open("copy.jpg", "wb") as dst:
while chunk := src.read(buffer):
dst.write(chunk)
print("Скопировано бинарно")
В бинарном режиме не указывайте encoding
. Данные — это байты, не текст.
Частые задачи: JSON и CSV
JSON: запись с русскими символами
import json, pathlib
stats = {"users": 120, "active": True, "title": "Отчёт"}
pathlib.Path("out").mkdir(exist_ok=True)
with open("out/stats.json", "w", encoding="utf-8") as f:
json.dump(stats, f, ensure_ascii=False, indent=2)
print("JSON сохранён")
CSV: не забывайте про newline="" в Windows
import csv
rows = [("name", "score"), ("Alice", 10), ("Bob", 8)]
with open("out/scores.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f, delimiter=";")
writer.writerows(rows)
print("CSV сохранён")
Быстро и надёжно с pathlib
from pathlib import Path
p = Path("data/notes.txt")
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text("Первая строка\nВторая строка", encoding="utf-8")
print(p.read_text(encoding="utf-8"))
Path.read_text
и Path.write_text
— удобные шорткаты для текстовых файлов.
Безопасная запись: атомарная замена
Чтобы не потерять файл при сбое, пишите во временный файл и заменяйте целевой одним движением.
from pathlib import Path
out = Path("out/data.txt")
out.parent.mkdir(exist_ok=True)
_tmp = out.with_suffix(".tmp")
_tmp.write_text("новые данные", encoding="utf-8")
_tmp.replace(out) # атомарно в пределах одного диска
Оптимизация и полезные параметры
- buffering: размер буфера I/O. Например,
open(..., buffering=1024*64)
для крупных операций. - newline: контроль переводов строк. Для CSV — всегда
newline=""
. - exists_ok: при создании директорий через
Path.mkdir
не падать, если уже существует.
Чек-лист по работе с файлами
- Явно указывайте
encoding="utf-8"
для текста. - Для больших файлов используйте построчное чтение.
- При записи CSV в Windows не забудьте
newline=""
. - Для критичных данных — атомарная запись через временный файл.
- Храните пути в
pathlib.Path
и избегайте жёстких строк с разделителями.
Хотите глубже освоить основы, разобрать больше практических кейсов и закрепить навыки проектами? Рекомендую посмотреть программу и стартовать на курсе «Python с Нуля до Гуру» — отличная систематизация с упором на практику.
Итог
Теперь вы уверенно выполняете чтение и запись файлов в Python, знаете режимы open()
, учитываете кодировки и избегаете частых ошибок. Эти навыки — базис для реальных задач: от парсинга логов до подготовки данных для аналитики и ML.
-
-
Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.