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

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

Чтение и запись файлов в 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,100n", "Bob,200n"]
    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,300n")

    Запрет перезаписи (режим 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.

    Источник

    НЕТ КОММЕНТАРИЕВ

    Оставить комментарий