Базовые операции с файлами, чтение и запись в файл

Для совершения простых операций с файлами в Python существует встроенная функция open. Она принимает следующие параметры:

  • file - путь к файлу, который нужно открыть. (строка или объект Path).
  • mode - режим открытия файла. (строка). примеры допустимых значений:

'r' - для чтения (по умолчанию)
'w' - для записи, сначала обрезая файл
'x' - для монопольного создания, сбой, если файл уже существует
'а' - для записи, добавив в конец файла, если он существует
'b' - двоичный режим
't' - текстовый режим (по умолчанию)
'+' - для обновления (чтение и запись)

Базовый пример использования выглядит так:

f = open('/path/to/some-file.txt')  # Открываем файл на чтение
lines = f.readlines()               # Считываем все строки из файла в список
f.close()                           # Закрываем файл после использования

Конечно, мы можем использовать open так, как в примере выше, но стоит сказать, что в Python существует специальная конструкция with. Она оборачивает блок кода в так называемый "менеджер контекста", позволяя гарантированно, даже при появлении какой-либо ошибки исполнения, выполнить в конце блока какой-либо код, (например, для очистки используемых ресурсов, закрытия файлов, и т. д.). Это гарантирует нам, что в программе не будет утечек памяти, даже если программа прервёт своё исполнение в середине этого блока.

Как использовать with для надёжной работы с файлами?

with open('/path/to/some-file.txt') as f:  # Открываем файл на чтение
    lines = f.readlines()  # Считываем все строки из файла в список
    # Здесь файл обязательно будет закрыт, даже если возникнет ошибка.
# переменную lines можно использовать и здесь,
# она не скрыта внутри блока with.

Хотя и можно использовать для передачи пути файла в функцию open просто строки, но зачастую с путями в файловой системе удобнее работать с помощью специализированной библиотеки pathlib. Самая важная часть модуля, которая может нам пригодиться - объект Path. С помощью него мы можем выражать пути без привязки к конкретной ОС (как вы могли заметить, в разных ОС формат записи путей отличается), а также получать специальные пути, специфичные для конкретной системы.

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

p = Path('.')  # Создаём путь к каталогу исполняемого скрипта
print(p.absolute())  # Выводим путь в абсолютном (развёрнутом) виде в консоль

Мы также можем комбинировать различные пути с помощью оператора /, и передавать Path в встроенные в python модули:

from pathlib import Path

home = Path.home()  # Путь к домашней папке пользователя
file_path = home / 'Documents' / 'test.txt'

# Выведет:
# на Unix:     ~/Documents/test.txt
# на Windows:  C:\Users\<пользователь>\Documents\test.txt
print(file_path) 

with open(file_path) as f:
    lines = f.readlines()

print("\n".join(lines))