Skip to content

Instantly share code, notes, and snippets.

@dvmn-tasks
Last active Mar 22, 2019
Embed
What would you like to do?

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

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

Открыл файл, а в нём крокозябры

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

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

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

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

sample_text

Читать файл научились, а как в него писать?

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

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

Если ничего непонятно

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment