Работа с файлами в Python

Работа с файлами в Python


Работа с файлами в Python

Определение и основные понятия

Файл — это объект, предоставляющий интерфейс для взаимодействия с данными на диске. В Python файлы делятся на два типа:

  • Текстовые: Содержат символы (открываются в режиме 'r', 'w', 'a').
  • Бинарные: Хранят данные в виде байтов (режим 'b', например, 'rb' или 'wb').

Файлы открываются функцией open(), которая возвращает файловый объект.

file = open("example.txt", "r")  # Открытие файла для чтения

Свойства файлов

  1. Режимы доступа:

    • 'r': Чтение (по умолчанию).
    • 'w': Запись (перезаписывает файл).
    • 'a': Добавление в конец файла.
    • 'r+': Чтение и запись.
    • 'b': Бинарный режим (например, 'wb').
  2. Кодировка: Для текстовых файлов можно указать кодировку (например, encoding='utf-8').

  3. Закрытие: Файл обязательно нужно закрывать методом close() или через контекстный менеджер.


Основные методы и операции

1. Открытие и закрытие

file = open("data.txt", "w", encoding="utf-8")
file.close()  # Всегда закрывайте файл!

2. Чтение данных

  • read(): Читает весь файл.
  • readline(): Читает одну строку.
  • readlines(): Возвращает список строк.
with open("data.txt", "r") as file:
    content = file.read()  # Весь текст
    line = file.readline() # Одна строка
    lines = file.readlines() # Список строк

3. Запись данных

  • write(): Записывает строку.
  • writelines(): Записывает список строк.
with open("output.txt", "w") as file:
    file.write("Hello, World!\n")
    file.writelines(["Line 1\n", "Line 2\n"])

4. Навигация по файлу

  • seek(offset): Перемещает курсор на позицию offset.
  • tell(): Возвращает текущую позицию курсора.
file.seek(0)  # Переход в начало файла
pos = file.tell()  # Текущая позиция

Сохранение объектов в файл

1. Pickle

Модуль pickle сериализует Python-объекты в бинарный формат.

import pickle

data = {"name": "Alice", "age": 30}

# Запись
with open("data.pkl", "wb") as file:
    pickle.dump(data, file)

# Чтение
with open("data.pkl", "rb") as file:
    loaded_data = pickle.load(file)

Особенности:

  • Поддерживает сложные объекты (классы, функции).
  • Небезопасно: Не загружайте данные из ненадежных источников.

2. JSON

Модуль json сохраняет данные в текстовом формате, понятном другим языкам.

import json

data = {"name": "Alice", "age": 30}

# Запись
with open("data.json", "w") as file:
    json.dump(data, file)

# Чтение
with open("data.json", "r") as file:
    loaded_data = json.load(file)

Ограничения:

  • Поддерживает только базовые типы (строки, числа, списки, словари).
  • Для классов используйте методы __dict__ или кастомные сериализаторы.

3. Другие форматы

  • CSV: Для табличных данных (модуль csv).
  • YAML/XML: Для сложных структур (сторонние библиотеки, например, PyYAML).

Контекстные менеджеры (File Context Managers)

Контекстный менеджер (with) автоматически закрывает файл, даже если произошла ошибка.

with open("file.txt", "r") as file:
    content = file.read()
# Файл закрыт автоматически!

Преимущества:

  • Исключает утечку ресурсов.
  • Упрощает код (не нужно вызывать close()).

Примеры использования

1. Построчная обработка большого файла

with open("large_file.txt", "r") as file:
    for line in file:  # Файл — итерируемый объект
        print(line.strip())

2. Запись логов

import datetime

log = f"{datetime.datetime.now()}: User logged in.\n"
with open("app.log", "a") as file:
    file.write(log)

Заключение

Файлы — ключевой инструмент для работы с данными в Python. Основные правила:

  • Всегда используйте контекстные менеджеры (with).
  • Для объектов применяйте pickle (Python-специфично) или json (универсально).
  • В бинарных файлах используйте режим 'b'.

Правильная работа с файлами предотвращает утечки памяти и обеспечивает целостность данных. Для сложных задач (например, асинхронной записи) изучайте специализированные библиотеки (например, aiofiles).