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

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

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

Чтобы открыть файл, используется функция 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 (т.е. с отступом от него) — делается с открытым файлом. Как только файл не нужен, вы убираете отступ и файл сам закроется.

Открыть файл в папке

Допустим, рядом c вашим файлом main.py, из которого вы запускаете код, лежит папка files. В этой папке лежит файл file.txt:

.
├── files
│   └── file.txt
└── main.py

Вам очень нужно открыть файл file.txt, но он спрятался в папке, что же делать? Вот как его открыть:

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

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

Бывает, что вы знаете, что файл в порядке, но 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)

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


Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.