Чтение и запись файлов в 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.
- 
					Создано 15.10.2025 17:02:07
					 - 
					
					Михаил Русаков				 
			
		
			
				
				
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.