Доброго времени суток, читатели, зрители моего канала programmer's notes.
Приложение 1 к видео
Стандартные функции работы с файлами Python
Данное приложение это справочный материал к стандартной библиотеке языка Python по работе с файлами. Будет ещё одно приложение, непосредственно относящееся к видео 3.
Материал, представленный в тексте, значительно превосходит содержимое видеоурока и будет разъясняться в последующих публикациях.
Функция open()
Функция open() открывает существующий файл и возвращает объект, с помощью которого можно выполнять чтение и запись данных. Если открыть файл не удалось то "бросается" исключение, которое можно "поймать" обычным способом через try...except и к этому вопросу мы вернёмся в следующем Приложении к нашему уроку. В общем виде заголовок функции выглядит так
open(path_file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
На всякий случай советую освежить в памяти материал, касающийся параметров функций (позиционные, по-умолчанию, именованные и т.д.). Он здесь.
- path_file — имя файла, полное, короткое (в текущем каталоге), относительное, который должен быть открыт.
- mode — режим открытия. Текстовый или бинарный. Следует иметь в виду, что все файлы, которые хранятся в файловой системе в сущности бинарны. Просто в программе, можно "трактовать" их структуру. Простейшая трактовка — текстовые файлы. Предполагается, что текстовый файл состоит из строк, отделяемых друг от друга символом (или несколькими), для которого есть специальное обозначение '\n'. Сама же строка предполагается состоящей из символов той или иной кодировки. Возможные значения для mode представлены ниже в таблице.
Как видно из таблицы и структуры заголовка функции open() обязательным является только первый параметр — имя файла.
- buffering — определяет способ буферизации. 0 — отключить буферизацию для бинарный файлов; 1 — построчная буферизация для текстовых файлов; -1 — буферизация по-умолчанию; целое число больше единицы определяет размер буфера в байтах. Для текстовых файлов параметр задаётся равным 1. В бинарных файлах система Python сама определяет размер буфера.
- encoding — данный параметр следует использовать только для текстовых файлов. Например encoding="utf-8". По умолчанию используется кодировка по умолчанию в операционной системе.
- errors — определяет, как должны обрабатываться ошибки кодирования и декодирования. Обычно этот параметр не задают. Хотя, если работаете с файлами разной кодировки, то следует обратить внимание на параметр.
- newline — параметр определяем алгоритм выделения строк. Следует обратить внимание, если ваша программа будет кроссплатформенной, т.е. будет работать в разных операционных системах. Параметр может быть равен '\n', '\r', '\r\n', '', None.
- При чтении. Если параметр равен None, то символы '\n', '\r' или '\r\n' на выходе преобразуются в разделитель строки '\n'. Если параметр равен '\n', '\r', '\r\n', то из результаты будут убирать именно эти значения. Если параметр равен '', то будут удалены все символы окончания строк и файл превратиться в одну большую строку.
- При записи. Если параметр равен None, то будет вставляться тот разделитель строк, который принят в данной системе. Если параметр равен '' или '\n', то символы окончания строк \n переводится в разделители строк не будут. В файл запишется одна большая строка. Если параметр равен '\r', то в результате записи сохранится значение \r в качестве разделителя строк, если параметр равен '\r\n', то запишется сочетание '\r\n'.
- closefd — при открытии файла должен быть равен True (по умолчанию). Параметр можно менять, если вместо имени используется дескриптор файла. Этот вопрос мы отложим до будущих рассмотрений.
- opener — используется для передачи управления настраиваемой специальной функции для открытия файла.
Замечание
Мы дали полное (ну почти) описание функции open(). В большинстве случаев нам понадобятся только два первых параметра. Но есть и специальные случаи и здесь всё совсем не просто. В разных операционных систем могут быть отличия. И тогда приходится пользоваться, в частности, библиотекой os. Но о ней пойдёт речь в своё время в данной же подборке.
Функции чтения из файла
Ну этот вопрос довольно хорошо был освящён в видеоуроке. И мы вернёмся к нему в следующем приложении. Здесь сделаем только краткий обзор.
Следует разделить чтение из текстовых файлов и чтение из бинарных файлов.
Первый способ чтения из текстового файла
Т.е. f1 в данном случае ведёт себя как итерируемый объект. При этом t присваивается строка вместе с символом разделителем.
Второй способ чтения из текстового файла
Для чтения последовательно одной строки за другой, можно использовать метод readline(). Метод может содержать аргумент — количество символов, которые нужно считать. Опять же, если использовать без аргумента, то считывается вся строка с символом разделения строк '\n'.
Третий способ чтения заключается в использовании метода readlines(), который считывает сразу все строки и помещает их в список. И опять элемент списка, т.е. строка также содержит символ '\n'. Пример был приведён на видеоуроке и будет также разобран во втором приложении к уроку. У метода также может быть целый аргумента, который будет определять количество считываемых символов. Но работает он своеобразно. Список всё равно заполняется по-строчно, в зависимости от указанного количества символов.
Четвёртый способ чтения предполагает использования метода read(). Без параметра функция читает весь файл, который трактуется как текстовый. Таким образом мы получаем одну огромную строку, внутри которой могут быть разделители '\n'. В качестве аргумента можно указать количество читаемых символов. При чем учитывается и символ в конце строки.
Что касается бинарных файлов, то я не буду здесь особо останавливаться на этой технологии. Этому будут посвящены отдельные уроки и текстовые приложения. Укажу только, что если мы открыли файл как бинарный (см. описание open()), то метод read() читает уже не по-символьно, а по-байтно. Следует также иметь в в виду метод seek(), с помощью которого можно передвигаться по бинарному файлу, как вперёд, так и назад к началу. Надо иметь в виду, что при обычном открытии бинарного файла указатель стоит на его начале, а при чтении скажем N байтов, передвигается на N байтов в сторону конца. Метод же seek() как раз и позволяет обращаться к любому месту бинарного файла, т.е. свободно двигаться по нему. Есть также метод tell(), который возвращает позицию указателя в данный момент.
Функции записи в файл
Основным методом для записи в файл является метод write(). Писать можно строку или массив байтов. О строках байтов я писал здесь. Но, видимо, придётся вернуться к этому вопросу ещё раз. Однако для записи в файл можно использовать и обычную функцию print(). Например
Имеется довольно интересный метод writelines(), позволяющий записывать список в текстовый файл. При этом следует иметь в виду, символы перевода строки не вставляются автоматически этим методом, поэтому следует подготовить соответствующим образом подготовить список. Но мы вернёмся к этому методу в следующих уроках.
Также следует отметить здесь метод flush(), который вынуждает систему сбросить буфер записи непосредственно на устройство. При больших объемах обработки данных, хранящихся на внешних устройствах не нужно забывать об этом методе.
Закрытие файла
Метод close() закрывает открытый файл. Также закрытие файла происходит, если если количество ссылок на объект-файл становится равным нулю. Закрытие файла, после того, как все операции с ним закончены является правилом хорошего тона. Дело в том, что на количество открытых файлов в системе всегда есть лимит и это следует помнить. При закрытии файла освобождаются все ресурсы, операционной системы, которые были использованы при работе с ним.
Данное приложение заканчивается, но будет еще и второе для видео 3. Не менее важное, кстати.
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.