Работа с файлами — одна из ключевых задач для многих программ. Python предоставляет простой и удобный интерфейс для чтения и записи данных в файлы. В этой статье разберём основные операции с файлами и познакомимся с концепцией контекстных менеджеров, которые помогают управлять ресурсами. Также мы создадим программу, которая считает количество строк и символов в текстовом файле.

Открытие и закрытие файлов

Python использует функцию open() для открытия файла. После работы с файлом его нужно закрыть с помощью метода close(), чтобы освободить системные ресурсы.

Пример открытия и закрытия файла:

file = open("example.txt", "r")  # Открытие файла в режиме чтения
content = file.read()            # Чтение содержимого
file.close()                     # Закрытие файла

Но вручную закрывать файл не всегда удобно. Именно для этого используются контекстные менеджеры.

Контекстные менеджеры: with open

Контекстные менеджеры автоматически закрывают файл, когда работа с ним завершена. Это избавляет нас от необходимости вручную вызывать close() и гарантирует, что файл всегда будет корректно закрыт, даже если внутри блока возникнет ошибка.

Синтаксис:

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

Основные режимы открытия файла

  • «r» — чтение (по умолчанию). Если файл не существует, возникает ошибка.
  • «w» — запись. Если файл уже существует, его содержимое будет перезаписано.
  • «a» — добавление. Данные записываются в конец файла.
  • «r+» — чтение и запись.
  • «w+» — запись и чтение. Содержимое файла удаляется.
  • «a+» — добавление и чтение. Данные записываются в конец файла, а содержимое доступно для чтения.

Чтение данных из файла

Python предоставляет несколько методов для чтения файлов:

  • read() — считывает весь файл и возвращает его как строку.
  • readline() — считывает одну строку из файла.
  • readlines() — считывает весь файл и возвращает его как список строк.

Пример:

with open("example.txt", "r") as file:
    content = file.read()  # Чтение всего содержимого
    print(content)

with open("example.txt", "r") as file:
    line = file.readline()  # Чтение одной строки
    print(line)

with open("example.txt", "r") as file:
    lines = file.readlines()  # Чтение файла как списка строк
    print(lines)

Запись данных в файл

Для записи в файл используется метод write() или writelines(). При использовании режима «w» файл будет перезаписан, а «a» добавляет данные в конец файла.

Пример записи:

with open("output.txt", "w") as file:
    file.write("Hello, World!\n")  # Запись строки в файл

with open("output.txt", "a") as file:
    file.writelines(["Python\n", "is\n", "awesome!\n"])  # Запись списка строк

Пример программы: Подсчёт строк и символов в текстовом файле

Создадим программу, которая:

  • Запрашивает у пользователя имя текстового файла.
  • Подсчитывает количество строк и символов в файле.
  • Выводит результаты на экран.

Код программы

def count_lines_and_characters(filename):
    try:
        with open(filename, "r") as file:
            lines = file.readlines()
            num_lines = len(lines)
            num_characters = sum(len(line) for line in lines)
            return num_lines, num_characters
    except FileNotFoundError:
        print(f"Ошибка: файл '{filename}' не найден.")
    except IOError:
        print("Ошибка: не удалось открыть файл.")
    return None, None

def main():
    filename = input("Введите имя текстового файла: ")
    num_lines, num_characters = count_lines_and_characters(filename)
    if num_lines is not None and num_characters is not None:
        print(f"Количество строк: {num_lines}")
        print(f"Количество символов: {num_characters}")

if __name__ == "__main__":
    main()

Разбор программы

Функция count_lines_and_characters:

  • Сначала мы открываем файл в режиме чтения с использованием with open.
  • Считываем все строки файла методом readlines().
  • Вычисляем количество строк с помощью len(lines).
  • Подсчитываем общее количество символов, проходя по всем строкам и суммируя их длины.
  • Если файл не найден, выбрасывается исключение FileNotFoundError, которое мы обрабатываем, выводя сообщение об ошибке.

Основная функция main:

  • Запрашивает у пользователя имя файла.
  • Вызывает функцию count_lines_and_characters и выводит результат, если файл был успешно обработан.

Если файл не найден или произошла другая ошибка при чтении, программа выводит соответствующее сообщение.

Заключение

Работа с файлами в Python даёт возможность хранить и обрабатывать данные вне программы. Использование контекстных менеджеров позволяет легко управлять файлами и избегать утечек ресурсов. Благодаря обработке исключений наша программа может корректно реагировать на ошибки, такие как отсутствие файла, и обеспечивать более стабильное поведение.