Файлы в python, ввод-вывод
Эта статья посвящена работе с файлами (вводу/выводу) в Python: открытие, чтение, запись, закрытие и другие операции.
Файлы Python
Файл — это всего лишь набор данных, сохраненный в виде последовательности битов на компьютере. Информация хранится в куче данных (структура данных) и имеет название «имя файла» (filename).
В Python существует два типа файлов:
- Текстовые
- Бинарные
Текстовые файлы
Это файлы с человекочитаемым содержимым. В них хранятся последовательности символов, которые понимает человек. Блокнот и другие стандартные редакторы умеют читать и редактировать этот тип файлов.
Текст может храниться в двух форматах: ( .txt ) — простой текст и ( .rtf ) — «формат обогащенного текста».
Бинарные файлы
В бинарных файлах данные отображаются в закодированной форме (с использованием только нулей (0) и единиц (1) вместо простых символов). В большинстве случаев это просто последовательности битов.
Они хранятся в формате .bin .
Любую операцию с файлом можно разбить на три крупных этапа:
- Открытие файла
- Выполнение операции (запись, чтение)
- Закрытие файла
Открытие файла
Метод open()
В Python есть встроенная функция open() . С ее помощью можно открыть любой файл на компьютере. Технически Python создает на его основе объект.
- file_name = имя открываемого файла
- access_mode = режим открытия файла. Он может быть: для чтения, записи и т. д. По умолчанию используется режим чтения ( r ), если другое не указано. Далее полный список режимов открытия файла
Пример
Создадим текстовый файл example.txt и сохраним его в рабочей директории.
Следующий код используется для его открытия.
В этом примере f — переменная-указатель на файл example.txt .
Следующий код используется для вывода содержимого файла и информации о нем.
Стоит обратить внимание, что в Windows стандартной кодировкой является cp1252 , а в Linux — utf-08 .
Закрытие файла
Метод close()
После открытия файла в Python его нужно закрыть. Таким образом освобождаются ресурсы и убирается мусор. Python автоматически закрывает файл, когда объект присваивается другому файлу.
Существуют следующие способы:
Способ №1
Проще всего после открытия файла закрыть его, используя метод close() .
После закрытия этот файл нельзя будет использовать до тех пор, пока заново его не открыть.
Способ №2
Также можно написать try/finally , которое гарантирует, что если после открытия файла операции с ним приводят к исключениям, он закроется автоматически.
Без него программа завершается некорректно.
Вот как сделать это исключение:
Файл нужно открыть до инструкции try , потому что если инструкция open сама по себе вызовет ошибку, то файл не будет открываться для последующего закрытия.
Этот метод гарантирует, что если операции над файлом вызовут исключения, то он закроется до того как программа остановится.
Способ №3
Инструкция with
Еще один подход — использовать инструкцию with , которая упрощает обработку исключений с помощью инкапсуляции начальных операций, а также задач по закрытию и очистке.
В таком случае инструкция close не нужна, потому что with автоматически закроет файл.
Вот как это реализовать в коде.
Чтение и запись файлов в Python
В Python файлы можно читать или записывать информацию в них с помощью соответствующих режимов.
Функция read()
Функция read() используется для чтения содержимого файла после открытия его в режиме чтения ( r ).
Синтаксис
- file = объект файла
- size = количество символов, которые нужно прочитать. Если не указать, то файл прочитается целиком.
Пример
Интерпретатор прочитал 7 символов файла и если снова использовать функцию read() , то чтение начнется с 8-го символа.
Функция readline()
Функция readline() используется для построчного чтения содержимого файла. Она используется для крупных файлов. С ее помощью можно получать доступ к любой строке в любой момент.
Пример
Создадим файл test.txt с нескольким строками:
Посмотрим, как функция readline() работает в test.txt .
Обратите внимание, как в последнем случае строки отделены друг от друга.
Функция write()
Функция write() используется для записи в файлы Python, открытые в режиме записи.
Если пытаться открыть файл, которого не существует, в этом режиме, тогда будет создан новый.
Синтаксис
Пример
Предположим, файла xyz.txt не существует. Он будет создан при попытке открыть его в режиме чтения.
Переименование файлов в Python
Функция rename()
Функция rename() используется для переименовывания файлов в Python. Для ее использования сперва нужно импортировать модуль os.
- src = файл, который нужно переименовать
- dest = новое имя файла
Пример
Текущая позиция в файлах Python
В Python возможно узнать текущую позицию в файле с помощью функции tell() . Таким же образом можно изменить текущую позицию командой seek() .
Name already in use
py_training_ru / lecture_08.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Лекция 8. Ввод-вывод в файлы. Конструкция with
Значки, используемые в тексте
- — отмечает, что высказывание не совсем верно, но будет уточнено позднее.
- ⭐ — выделяет определение нового понятия.
- ❗ — привлекает внимание к высказыванию.
- ☝️ — указывает на небольшое отступление от темы или уточнение.
- — индикатор традиций и договорённостей.
- ⚠️ — требуется осторожность: возможно, сложное высказывание.
Повторение терминов из седьмой лекции
- Конструкция try-except-else — синтаскическая конструкция (сложное утверждение), предназначенная для обработки исключений из блока try в блоках except и выполнения блока else в случае отсутствия ошибок.
- Утверждение raise — утверждение, дающее возможность непосредственно вызвать исключение в коде.
Что такое файл? С точки зрения Python, это объект файловой системы, поддерживающий потоковое чтение и запись.
Для того, чтобы начать работу с файлом (чтение или запись), необходимо открыть файл, с указанием вида работы.
Файл обычно идентифицируется именем, и Python также использует имя файла для его открытия, которое осуществляется встроенной функцией open() :
Функция open() принимает как минимум 1 аргумент — имя файла — и возвращает объект типа file (также встроенный в Python тип), с которым далее и ведётся работа. Вторым аргументом функции указывается способ работы, то есть чтение или запись; по умолчанию, файл открывается на чтение.
У объекта файла есть набор атрибутов и методов, которые в дальнейшем используются для работы с файлом.
Имя файла, связанного с объектом, доступно через атрибут file.name :
При отсутствии такого файла или невозможности открыть его (например, нет разрешений, либо файл является каталогом) возникнет исключение IOError .
Чтобы прочитать содержимое файла, используется метод file.read() . Он возвращает Python-строку ( str ) состоящую из всего содержимого файла, либо если передать ему 1 аргумент — целое число N, то строка будет состоять из первых N байт файла (либо файла целиком, если его размер меньше N байт).
Можно написать программу из 2 строк, которая выведет собственный код, для этого достаточно сохранить её в файл например program1.py и написать:
Указатель позиции в файле
Если вызвать метод file.read() без аргументов более одного раза, то он вернёт пустую строку:
Объяснение этому таково. Файл можно представить как упорядоченную последовательность байт, каждый из которых имеет индекс, начиная с 0 (первый байт) и до «размер файла — 1». При чтении данных из файла, каждый байт условно по очереди передаётся в строку-результат, и индекс (указатель на текущий байт) увеличивается. По окончании чтения, индекс остаётся в том же месте, и следующее чтение начнётся с этого индекса. Если мы уже прочитали весь файл, то логично, что данных после текущего указателя уже нет.
Метод file.read() не только читает данные из файла, но и увеличивает указатель на кол-во прочитанных байт. Если в цикле читать из файла по одному байту, то каждый раз в результате чтения будет следующий байт, до тех пор, пока мы не достигнем конца файла.
Текстовые и бинарные файлы
Во многих системах файлы бывают двух «разновидностей»: текстовые и двоичные (бинарные). В общем любой файл можно считать бинарным, особенно если нам не требуется работать с файлом по частям. Если мы считываем весь файл в строку с помощью метода file.read() , то далее мы можем работать со строкой, полностью игнорируя вид файла.
Главное отличие этих видов в семантике доступа: для текстовых файлов имеет смысл построчный доступ, для бинарных — посимвольный или буферизованный.
С точки зрения пользователя, вид файла не всегда имеет значение, скажем, файл с данными xml или json по содержанию является текстовым, но едва ли имеет смысл обрабатывать его построчно, так как данные представляют собой единую структуру. В то же время файл типа doc для пользователя представляет двоичную кодировку текста.
Работа с текстовыми файлами
Типичным текстовым файлом является файл программы на Python. Для построчного чтения текстовых файлов существует метод file.readline() , который читает строку из файла и увеличивает указатель на длину прочитанной строки. При этом конец строки определяется настройками текущей ОС: для Linux концом строки служит символ перевода строки «\n» (или «\x0a» ), для Windows — последовательность «\r\n» (или «\x0d\x0a» ).
Этот метод удобно использовать в цикле while , опять же проверяя, что считанная строка не пустая. Также в этом методе можно задавать максимальную длину считываемой строки.
Для большего удобства построчного чтения файлов целиком, в цикле for мы можем использовать метод file.readlines() :
Или даже ещё проще:
Объект типа файл является итерируемым, как списки и строки, и итерируется по строкам, содержащимся в файле.
Работа с бинарными файлами
Для итеративной (поблочной) работы с бинарными файлами используется метод file.read(N) , где N — размер считываемого блока. Проверять, что достигнут конец файла, можно, сравнивая длину результата с N, либо также считывать до получения пустой строки.
У бинарных файлов есть ещё одно отличие: мы можем узнать, где сейчас указатель, и передвинуть указатель вручную на нужное место. (То есть, мы можем это делать и в текстовых файлах, но там это бессмысленно.) Для этого предназначены два соответствующих метода: file.tell() и file.seek() .
Первый возвращает индекс байта, на котором сейчас указатель; второй — принимает число-индекс в качестве аргумента и устанавливает указатель на этот индекс.
Таким образом, мы в теории сможем при достижении конца файла вернуть указатель на начало и прочитать содержимое заново. Впрочем, на практике это крайне редко используется.
Для разрешения записи в файл, как мы уже упомянули выше, необходимо сообщить функции open() , что мы открываем файл на запись. Режим работы с файлом передаётся вторым аргументом функции open() и представляет собой строку.
Запись может быть двух видов: перезапись (создание файла, если его ещё нет, либо пересоздание файла, если он уже есть) и дозапись (добавление в конец файла, если он есть, либо ошибка IOError в случае отсутствия).
Режим записи обозначается строкой «w» , режим добавления — строкой «a» .
Далее, собственно писать в файл можно исользуя метод file.write() , который принимает параметр — Python-строку с содержимым для записи. При записи, как и при чтении, указатель позиции в файле увеличивается на количество записанных байт.
Однако если просто записать в открытый файл, записанные данные не сохранятся. Для сохранения данных необходимо закрыть файл, это делается методом file.close() .
Примечание: файлы сами закрываются при выходе из программы, но крайне рекомендуется закрывать их вручную во избежание ошибок.
Смешанные режимы открытия файла
Возможно также открыть файл в режиме, совмещающем чтение и запись. Существует три таких режима:
- чтение с возможностью записи, режим «r+»
- перезапись с возможностью чтения, режим «w+»
- дозапись с возможностью чтения, режим «a+»
Они в целом соответствуют своим «основным» режимам.
Некоторые синтаксические конструкции, облегчающие работу с файлами
Представим себе ситуацию, что мы обрабатываем файл построчно и ищем какую-то строку, после которой дальнейшая обработка уже не имеет смысла. Используя цикл for , нам бы пришлось создавать переменную-флаг и «вхолостую» пробегать остаток файла, проверяя этот флаг в каждой итерации.
К счастью, в Python можно обойтись куда более простой конструкцией.
Утверждение break даёт команду немедленно выйти из цикла к следующему за ним утверждению, полностью пропустив оставшиеся итерации и также все утверждения, идущие в блоке кода цикла после break .
В данном случае будет выводиться на экран каждая строка до строки, содержащей «end», не включая её, потому что цикл закончится до вывода её на экран.
Утверждение break можно использовать не только в обработке файлов, и не только в цикле for : циклы while также поддерживают его. Но в любом другом блоке кода, который не относится к циклам, использование break является синтаксической ошибкой.
Утверждение continue является дополнением break : оно пропускает все следующие за ним утверждения в блоке кода цикла и переходит к следующей его итерации. В случае с циклом for это означает — к обработке следующего элемента (если он есть), в случае while — к следующей проверке условия.
Его удобно использовать, если нам нужно, наоборот, начать обработку файла с какой-то строки файла или пропустить обработку строки.
Этот код будет пропускать все строки файла до строки, содержащей «start», начиная с неё, он начнёт выводить все те строки, которые не содержат «skip».
Объект файла, будучи итерируемым объектом (типа контейнера) является ещё и так называемым контекстным менеджером.
Контекстный менеджер умеет автоматически выполнять некторые действия по окончанию выполнения определённого контекста, который задаётся конструкцией with :
БЛОК_КОДА в данном случае и является контекстом. Независимо от того, произошли ли ошибки в БЛОКе_КОДА, контекстный менеджер всегда выполнит завершающие действия, а именно для файлов — их закрытие.
Возьмём пример, использованный выше:
Его можно переписать так:
И файл автоматически будет закрыт по окончанию блока кода в with .
Записать в новый текстовый файл числа от 1 до 10 по одному в строке.
- в файл можно записать только строковые данные.
- В конец записываемой строки необходимо добавлять символы перевода строки, для Windows это последовательность «\r\n» .
Прочитать из записанного файла числа от 3 до 7 включительно, используя break и continue . В результате должен получиться список из 5 чисел.
Бинарные файлы. Примеры работы с бинарными файлами
В данной теме показано как можно сохранять данные в бинарных файлах без использования стандартных средств pickle или struct языка Python.
Содержание
- 1. Понятие о бинарных файлах. Представление информации в бинарных файлах
- 2. Запись/чтение списка, который содержит вещественные числа. Пример
- 3. Запись/чтение кортежа, содержащего строки символов. Пример
- 4. Запись/чтение множества, содержащего вещественные числа. Пример
- 5. Запись/чтение двумерной матрицы строк заданного размера. Пример
- 6. Запись/чтение словаря. Пример
- 7. Копирование одного бинарного файла в другой
- 8. Объединение двух бинарных файлов
Поиск на других ресурсах:
1. Понятие о бинарных файлах. Представление информации в бинарных файлах
В языке Python существуют средства для работы с бинарными или двоичными файлами. Бинарные файлы используют строки типа bytes . Это значит при чтении бинарных данных из файла возвращается объект типа bytes .
Открытие бинарного файла осуществляется с помощью функции open() , параметр mode которой содержит символ ‘b’ . Более подробно об открытии/закрытии бинарных файлов описывается здесь .
В отличие от текстовых, бинарные файлы не выполняют преобразования символов конца строки ‘\n’ .
Пример, демонстрирующий особенности представления информации в бинарных файлах.
Результат работы программы
На основании примера выше можно сделать следующие выводы:
- строка бинарных данных выводится как строка;
- отдельный символ (элемент) бинарных данных представлен в виде 8-битных целых чисел.
2. Запись/чтение списка, который содержит вещественные числа. Пример
Результат работы программы
3. Запись/чтение кортежа, содержащего строки символов. Пример
В данном примере строки символов в бинарном файле разделяются символом ‘\n’ . Таким образом, можно записывать и читать информацию без потери ее структуры.
Результат работы программы
4. Запись/чтение множества, содержащего вещественные числа. Пример
Множество, которое содержит только однотипные объекты можно записать в файл. В данном примере записывается множество вещественных чисел.
Результат работы программы
Вид файла myfile6.bin
5. Запись/чтение двумерной матрицы строк заданного размера. Пример
В примере матрица представлена в виде списка.
Результат работы программы
Вид файла myfile7.txt
6. Запись/чтение словаря. Пример
Пусть задан некоторый словарь, который нужно записать в бинарный файл.
Результат работы программы
Вид файла myfile8.txt
7. Копирование одного бинарного файла в другой
8. Объединение двух бинарных файлов. Пример
В примере реализована операция объединения двух файлов в результирующий третий файл. Сначала данные с файлов-источников считываются в списки. Затем происходит конкатенация этих списков и запись результирующего списка в файл результата.
Файлы и сериализация в Python
Говоря просто, файл — это именованная область данных на носителе информации.
Для работы с файлом в python необходимо его предварительно открыть, чтобы получить handler файла, а после работы закрыть его.
Для этого используется функция open, которая также может использоваться как контекстный менеджер.
Файлы в Python
Режимы открытия файла:
- ‘r’ — открытие на чтение (является значением по умолчанию).
- ‘w’ — открытие на запись, содержимое файла удаляется, если файла не существует, создается новый.
- ‘x’ — открытие на запись, если файла не существует, иначе исключение.
- ‘a’ — открытие на дозапись, информация добавляется в конец файла.
- ‘b’ — открытие в двоичном режиме.
- ‘t’ — открытие в текстовом режиме (является значением по умолчанию).
- ‘+’ — открытие на чтение и запись.
Режимы могут комбинироваться (например ‘rt’ — режим по умолчанию).
Методы чтения данных из файла
- read() — читает файл от указателя текущей позиции до конца файла.
- read(n) — читает n символов из файла в случае открытия в текстовом режиме, или n байт в бинарном режиме.
- readline() — читает строку из файла.
- readlines() — возвращает список строк, содержащихся в файле.
- for-loop — файл, помещенный в цикл for, будет поочередно возвращать строки.
Методы записи в файл
- write(string) — пишет строку в файл.
- writelines(iterable) — пишет в файл список строк, которые содержатся в итерируемом объекте. Символ переноса строки автоматически не добавляется!
Прочие методы работы с файлом
- seek() — перемещает указатель файла.
- tell() — возвращает текущий указатель файла.
Сериализация
Часто случается необходимость передать определенные объекты по различным каналам связи, или сохранить в файл.
Для решения этой задачи используется сериализация — она позволяет преобразовать объект языка программирования(в нашем случае Python) в последовательность байт или текст(в зависимости от формата сериализации).
Процесс преобразования объекта называется сериализацией.
Обратный процесс(из бит в объект) — десериализация.
Pickle
Pickle — встроенный в Python модуль.
Обратите внимания, что pickle — небезопасный модуль. Будьте осторожны и десериализуйте только известные вам объекты.
Основные методы работы с pickle:
- pickle.dump(obj, file) — записывает сериализованный объект в файл.
- pickle.dumps(obj) — возвращает сериализованный объект.
- pickle.load(file) — загружает объект из файла.
- pickle.loads(data) — загружает объект из потока байт.
Объекты, которые могут быть сериализованы:
- None , True , False .
- Числа.
- Строки.
- Кортежи, списки, множества, словари, содержащие только сериализуемые с помощью pickle объекты.
- Функции, определенные в модуле(не внутри других объектов). (Не лямбда-функции, только обычные).
- Встроенные фукнции.
- Классы определенные в модуле.
- Экземпляры классов, при соблюдении определенных условий(подробнее, в документации).
Дополнительная информация
JSON(JavaScript Object Notation) — текстовый формат обмена данными. Несмотря на название, с JavaScript он прямо не зависит, и используется повсеместно.
Синтаксис JSON. JSON-текст представляет собой одну из двух структур:
- Набор пар ключ:значение.
- Упорядоченный набор значений.
Очевидно, что это очень похоже на структуры данных Python: словарь и список.