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

Загрузить данные в программу из файла, выгрузить данные в файл, записывать историю обращений к программе в специальный файл — всё это очень частые задачи.

Как открыть файл

Чтобы открыть файл, используется функция open():

my_file = open("myfile.txt", "r")
file_contents = my_file.read()
my_file.close()

В этом коде:

  • Функция open() принимает на вход 2 аргумента: путь до файла и права, с которыми его открыть. r — от read, т.е. мы просим открыть файл с правами на чтение.
  • Функция open() возвращает не текст в файле, а сам файл. Файл как бы теперь открыт, как если вы бы щёлкнули по нему дважды левой клавишей.
  • Метод файла .read() позволяет читать данные из файла. Строка с содержимым файла запишется в переменную file_contents.
  • Метод .close закрывает файл.

Как закрыть файл

Закрывать файлы важно по двум причинам:

  1. Чтобы читать и писать в один и тот же файл из разных мест программы.
  2. Чтобы не превысить лимиты операционной системы. У неё есть ограничение на число одновременно открытых файлов. Ограничение легко превысить, если открывать файлы в цикле.

Однажды вы точно забудете закрыть файл. В Python есть специальная команда на такой случай — with:

with open("myfile.txt", "r") as my_file:
  file_contents = my_file.read()
print(file_contents)

Выглядит немного непривычно, но суть простая: всё, что лежит "внутри" блока with (т.е. с отступом от него) — делается с открытым файлом. Как только файл не нужен, вы убираете отступ и файл сам закроется.

Ошибки кодировки

Бывает, что вы знаете, что файл в порядке, но Python читает его со странными символами: ������. Дело в кодировках: одни программы пользуются CP1251, другие ASCII, третьи UTF-8. К сожалению, программистам до сих пор не получилось окончательно перейти к какому-то одному варианту.

Чтобы открыть файл с нужной кодировкой, нужно передать функции open именованный аргумент encoding:

with open("myfile.txt", "r", encoding="ваша кодировка") as my_file:
   # ...

Если вы не знаете кодировку вашего файла, на Хабре есть интересная статья с такой схемой:

Запись в файл

Для записи в файл нужно лишь указать права w (write) и использовать не .read(), а .write():

my_text = "Хочу записать эту строку в файл"
with open("myfile.txt", "w") as my_file:
  my_file.write(my_text)

Альтернативные статьи