Python сохранение файла в оперативной памяти

Обновлено: 06.07.2024

Есть много способов ввода-вывода файлов в Python, и mmap-самый крутой, но редко используемый метод для того же самого. В этом уроке мы изучим функцию mmap в Python, а также узнаем о сопоставлении памяти, которое лежит в основе концепции функции mmap.

Что такое отображение памяти?

Сопоставление памяти-это процесс, с помощью которого конструкции машинного уровня используются для сопоставления файла непосредственно для использования в программе с диска. Он сопоставляет весь файл на диске с диапазоном адресов в адресном пространстве компьютерной программы. Программа может получить доступ к файлам на диске таким же образом, как и к данным из оперативной памяти.

Управление памятью в компьютере

Чтобы четко понять процесс, лежащий в основе отображения памяти и работы mmap, давайте кратко разберемся в типах компьютерной памяти.

  • Физическая память : Это оперативная память(ОЗУ) и энергонезависимая память. Он доступен программам, пока они активны.
  • Виртуальная память : Если у нас есть 64-разрядная машина, мы можем получить доступ к 17 миллиардам гигабайт данных. Но на самом деле наша физическая память составляет максимум 8 или 16 гигабайт в персональных компьютерах. Компьютер сопоставляет физическую память со своим виртуальным пространством и использует часть диска хранения, называемую пространством подкачки, чтобы компенсировать меньшее количество памяти, если мы запускаем большие программы, и нам не нужно беспокоиться о размере файла, даже если он слишком большой. Различные методы подкачки используются для обмена данными с диска в память во время использования.
  • Общая память : С помощью таких методов, как подкачка и виртуальная память, несколько программ могут работать одновременно, используя одну физическую память, даже если ее емкость невелика. Данные, которые не используются, отправляются в память подкачки, а данные, которые должны использоваться, копируются в основную память, таким образом, все программы работают.

Функция map использует концепцию виртуальной памяти, чтобы программе показалось, что в основную память был загружен большой файл.

Но на самом деле файл присутствует только на диске. Операционная система просто отображает адрес файла в адресное пространство программы, чтобы программа могла получить доступ к файлу.

Как использовать функцию mmap в Python?

Мы можем использовать модуль mmap для ввода-вывода файлов вместо простой работы с файлами. Давайте разберемся, как использовать mmap, с помощью следующего примера.

В приведенном выше примере,

  1. сначала мы импортируем модуль mmap
  2. затем определите путь к файлу на диске
  3. затем мы создаем объект file_object с помощью системного вызова open()
  4. После получения объекта file мы создаем отображение файла в адресное пространство программы с помощью функции mmap
  5. Затем мы считываем данные из объекта mmap
  6. и распечатайте данные.

Описание функции mmap

для mmap требуется файловый дескриптор для первого аргумента.

Аргумент length принимает размер отображаемой памяти в байтах, а аргумент access информирует ядро о том, как программа собирается получить доступ к памяти.

Аргумент offset указывает программе создать карту памяти файла после определенных байтов, указанных в смещении.

  • Дескриптор файла для первого аргумента предоставляется методом fileno() объекта file.
  • length во втором аргументе может быть указано 0, если мы хотим, чтобы система автоматически выбирала достаточный объем памяти для отображения файла.
  • Аргумент доступа имеет множество вариантов. ACCESS_READ позволяет пользовательской программе читать только из сопоставленной памяти. ACCESS_COPY и ACCESS_WRITE предлагают доступ в режиме записи. В режиме ACCESS_WRITE программа может изменять как сопоставленную память, так и файл, но в режиме ACCESS_COPY изменяется только сопоставленная память.
  • Аргумент смещения часто указывается 0, когда мы хотим сопоставить файл с начальным адресом.

Как записать данные в файл, сопоставленный с памятью?

Чтобы записать некоторые данные в файл, сопоставленный с памятью, мы можем использовать параметр ACCESS_WRITE в аргументе access и использовать функцию mmap_object.write() для записи в файл после создания объекта file, открыв файл в режиме r+ .

Здесь мы должны позаботиться о том, что mmap не позволяет сопоставлять пустые файлы. Это связано с тем, что для пустого файла не требуется сопоставление памяти, потому что это просто буфер памяти.

Важный момент, который мы должны иметь в виду в отношении приведенного выше примера, заключается в том, что входные данные должны быть преобразованы в байты перед записью в mmap.

Кроме того, map начинает запись данных с первого адреса файла и перезаписывает исходные данные. Если нам нужно сохранить предыдущие данные, мы можем сделать это, указав соответствующее смещение в вызове функции mmap.

Как получить доступ к определенной части файла с помощью mmap?

Мы можем получить доступ к части файла непосредственно с помощью объектов карты. объекты карты можно нарезать, как мы используем нарезку в списках python.

объекты mmap показывают поведение строк, и многие операции, выполняемые со строками, могут быть применены к объектам mmap.

объекты mmap можно нарезать, как мы используем нарезку в списках Python . Предположим, мы хотим прочитать от 10-го до 99-го символа файла. Мы можем сделать это, как показано в следующем примере.

Зачем использовать mmap в Python?

Простые операции чтения/записи делают много системных вызовов во время выполнения, что приводит к многократному копированию данных в разных буферах в процессе.

Использование mmap обеспечивает нам значительное улучшение производительности, поскольку оно пропускает вызовы функций и буферизует операции, особенно в программах, где требуется обширный ввод-вывод файлов.

Вывод

В этом уроке, во-первых, мы увидели, что такое отображение памяти. Затем мы рассмотрели методы управления памятью. Затем мы увидели, как использовать mmap в Python, используя различные примеры, а также увидели некоторые технические аспекты работы функции. Счастливого Обучения!

До теперь мы работали только с объектами, сохраненными в оперативной памяти компьютера. То есть после завершения работы программы все наши действия удалялись. Сегодня мы научимся работать с файлами в Python, то есть сохранять состояние программы в файле на жестком диске.

Открытие и закрытие файла в Python.

Перед тем как прочесть и записать что-либо в файл, его следует открыть. Чтобы открыть файл в Python используется встроенная функция open(). При вызове, эта функция создает объект типа файл, с которым в дальнейшем можно работать.

Синтаксис функции open() в Python.

my_file = open(имя_файла [, режим_доступа][, буферизация])

имя_файла: строка, содержащая имя файла с расширением. Например, "my_file.txt".

режим_доступа: строка, которой мы указываем для чего открывается файл: для чтения, записи, добавления информации, и т.д. Например, "w". По умолчанию файл открывается для чтения - "r".

буферизация: Целое число. Если значение аргумента указано 0 - файл открывается без буферизации, 1 с построчной буферизацией, больше одного процесс буферизации выполняется с указанным размером буфера. Отрицательное число - разер буфера будет равен системному.

Список режимов доступа к файлу в Python.

Атрибуты файлового объекта в Python.

Как только файл был открыт и у вас появился файловый объект, вы можете получить следующую информацию о нем:

Закрытие файла в Python. Метод close().

Метод файлового объекта close() автоматически закрывает файл, при этом теряется любая несохраненная информация. Работать с файлом (читать, записывать) после этого нельзя.

Python автоматически закрывает файл если файловый объект к которому он привязан присваивается другому файлу. Однако, хорошей практикой будет вручную закрывать файл командой close().

Чтение и запись файлов в Python

Для файлового объекта доступен целый набор методов, чтобы облегчить нашу работу с файлом.

Запись в файл в Python. Метод write().

Метод write() записывает любую строку в открытый файл. Важно помнить, что строки в Python могут содержать двоичные данные, а не только текст.

Метод write() не добавляет символ переноса строки ('\n') в конец файла.

Синтаксис метода write().

Вышеприведенный код создаст файл some.txt и запишет в него указанную строку.

Чтение из файла в Python. Метод read().

Метод read() читает строку из открытого файла.

Синтаксис метода read().

Необязательный параметр count - это количество байт, которые следует прочитать из открытого файла. Этот метод читает информацию с начала файла и, если параметр count не указан, до конца файла.

Например, прочтем созданный нами файл some.txt:

работа с файлами в python, python fileio

Как узнать позицию указателя в файле в Python.

После того как вы вызвали метод read() на файловом объекте, если вы повторно вызовете read(), то увидите лишь пустую строку. Это происходит потому, что после первого прочтения указатель находится в конце файла. Для того чтобы узнать позицию указателя можно использовать метод tell().

Говоря проще, метод tell() сообщает в скольких байтах от начала файла мы сейчас находимся.

Чтобы перейти на нужную нам позицию, следует использовать другой метод - seek().

Синтаксис метода seek().

Аргумент offset указывает на сколько байт перейти. опциональный аргумент from означает позицию, с которой начинается движение. 0 - означает начало файла, 1 нынешняя позиция, 2 - конец файла.

The seek(offset[, from]) method changes the current file position. The offset argument indicates the number of bytes to be moved. The from argument specifies the reference position from where the bytes are to be moved.

Добавление в файл. Метод write()

Если вы хотите не перезаписать файл полностью (что делает метод write в случае открытия файла в режиме 'w'), а только добавить какой-либо текст, то файл следует открывать в режиме 'a' - appending. После чего использовать все тот же метод write.

Расширенная работа с файлами в Python.

Для доступа к более широкому функционалу в работе с файлами в Python, как то удаление файлов, создание директорий и т.д. Следует подключить библиотеку os. Скоро выйдут статьи с примерами.

Приложение-пример работы с файлами в Python.

В качестве приложения примера мы напишем программу сохранения результата игрока. Программе задается имя игрока и его результат, а она добавляет эту запись в отсортированный список. Рейтинг результатов.


Ни одна компьютерная программа не может работать без данных. А данные, чтобы программа имела к ним доступ, должны располагаться в оперативной памяти вашего компьютера. Но что такое оперативная память на самом деле? Когда произносишь это словосочетание, многие сразу представляют «железную» плашку, вставленную в материнскую плату, на которой написано что-то типа 16Gb DDR4 2666MHz. И они, разумеется, правы — это действительно физический блок оперативной памяти, в котором, в итоге, все данные и оказываются. Но прежде, чем стать доступной внутри вашей программы, на память (как и на всё остальное аппаратное обеспечение) накладывается куча абстракций.

Во-первых, есть операционная система, которая посредством диспетчера (менеджера) оперативной памяти абстрагирует физическую оперативную память, позволяет реализовать механизмы SWAP-файлов и др.

Во-вторых, внутри операционной системы, есть абстракция, называемая «процесс», которая, в том числе, предназначена для изоляции и упрощения работы с ресурсами отдельными программами. Именно процесс «делает вид», что независимо от количества запущенных программ и объема установленной в компьютер оперативной памяти, вашей программе доступно 4 ГБ RAM (на 32-разрядных системах) или сильно больше (на 64-разрядных).

Долгое время, компьютерным программам, хватало этого набора абстракций. Вам нужны данные, вы хотите с ними поработать? Всё просто:

Попросите у процесса (ОС) выделить вам немного (одну или несколько страниц) оперативной памяти.

Поработайте с ней.

Верните ее в операционную систему.

Такой подход позволял работать с памятью максимально эффективно. Вы точно знали, сколько реально вам памяти выделено, зачем вы ее используете, и т.д. и т.п. Однако помимо преимуществ подход имеет и ряд недостатков. Ключевой из них — сложность. Управлять памятью вручную — это сложно и тяжело. Легко забыть что-то удалить или вернуть страницу операционной системе, и сразу возникает утечка: программа держит неиспользуемую память просто так, не давая применять ее для решения других задач.

Время шло, и в борьбе с этой проблемой постепенно появлялись новые инструменты и возможности. Одной из них стала концепция управляемой памяти, когда не вы, а runtime или библиотеки вашего языка программирования самостоятельно занимаются очисткой памяти. Это, пускай и жертвуя немного эффективностью, позволило сильно сократить трудозатраты на управление памятью и повысить надежность этого процесса.

Механизм памяти в Python

Python — это язык с управляемой памятью. Причем для управления ею он использует несколько механизмов. Я постараюсь коротко осветить основные из них. Для зануд сразу подчеркну, что под Python’ом я понимаю конкретную реализацию CPython, а не какие-то другие версии, в которых всё может работать по-другому :)

При запуске Python-программы создается новый процесс, в рамках которого операционная система выделяет пул ресурсов, включая виртуальное адресное пространство. В эту память загружается интерпретатор Python вместе со всеми необходимыми ему для работы данными, включая код вашей программы.

Оставшаяся свободная виртуальная память может использоваться для хранения информации об объектах Python’а. Для управления этой памятью в CPython используется специальный механизм, который называется аллокатор. Он используется каждый раз, когда вам нужно создать новый объект.

Обычно мы в своих программах не оперируем большими объектами. Большая часть наших данных — это числа, строки и т.п., они занимают не такой уж большой объем в расчёте на одно значение. Но зато мы создаем их достаточно часто. И это приводило бы к проблемам, если бы Python абсолютно все такие вызовы транслировал в операционную систему. Системный вызов на выделение памяти — штука трудозатратная, зачастую связанная с переходом в контекст ядра операционной системы и т.п. Поэтому одна из главных задач аллокатора Python — оптимизация количества системных вызовов.

Ремарка. Для больших объектов (больше 512 байт) Python выделяет память напрямую у ОС. Обычно таких объектов не очень много в рамках программы, и создаются они нечасто. Поэтому накладные расходы на создание таких объектов напрямую в RAM не так высоки.

Как же устроен аллокатор внутри? Он состоит из частей трёх видов:

Арена — большой непрерывный кусок памяти (обычно 256 килобайт), содержит несколько страниц виртуальной памяти операционной системы.

Пул — одна страница виртуальной памяти (обычно 4 килобайта).

Блок — маленький кусочек памяти, используемый для хранения одного объекта.

Давайте поговорим о них подробнее. Когда Python’у нужно расположить какой-то объект в оперативной памяти он ищет подходящую арену. Если такой нету, он запрашивает новую арену у операционной системы. Что значит «подходящую»? Арены организованы в двусвязный список и отсортированы от самой заполненной к самой свободной. Для добавления нового объекта выбирается САМАЯ ЗАПОЛНЕННАЯ арена. Почему такая странная логика? Это связано с политикой освобождения памяти. Арены — единственное место, в котором происходит запрос и освобождение памяти в Python. Если какая-то арена полностью освобождается от объектов, она возвращается назад операционной системе и память освобождается. Таким образом, чем компактнее живут объекты в рамках арен, тем ниже общее потребление оперативной памяти программой.

Внутри арен расположены пулы. Каждый пул предназначен для хранения блоков одинакового размера (то есть в одном пуле могут быть только блоки одного и тоже размера, при этом в арене могут быть пулы с разными размерами блоков).

Каждый пул может быть в одном из трех состояний — used, full и empty. Full означает, что пул полностью занят и не может принять новые объекты. Empty — что пул полностью пустой и может быть использован для хранения новых объектов (при этом пустой пул может быть использован для хранения объектов любого размера). Used — это пул, который используется для хранения объектов, но при этом еще не заполнен полностью.

Python поддерживает списки пулов каждого из размеров и отдельно список пустых пулов. Если вы хотите создать новый объект, то Python сначала пытается найти used-пул с нужным размером блока и расположить объект там. Если used-пула нет, тогда берется empty-пул, и объект создается в нем (а сам пул из статуса empty переводится в статус used). Если и empty-пулов нет, то запрашивается новая арена.

Внутри пула живут блоки. Каждый блок предназначен для хранения одного объекта. В целях унификации размеры блоков фиксированы. Они могут быть размером 8, 16, 24, 32 …. 512 байт. Если Вам нужно 44 байта для хранения объекта, то он будет расположен в блоке на 48 байт. Каждый пул содержит список свободных и занятых блоков (на самом деле, есть еще untouched-блоки, в которых никогда не жили данные, но по сценариям использования они похожи на free-блоки, поэтому не будем на них останавливаться подробно). Когда вы хотите разместить новый объект, берется первый свободный блок, и объект располагается в нем. Когда объект удаляется, его блок помещается в список свободных.

Время жизни объекта и при чем тут GIL

Поговорив о том, как происходит выделение и освобождение памяти в Python, стоит отдельно поговорить о том, а как язык управляет временем жизни. Для этого в Python реализовано два механизма:

Механизм сборки мусора.

Каждый объект в Python — это, в первую очередь, объект, унаследованный от базового класса PyObject. Этот самый PyObject содержит всего два поля: ob_refcnt — количество ссылок, и ob_type — указатель на другой объект, тип данного объекта.

Нас интересует первое поле — ob_refcnt . Это счетчик ссылок на конкретный экземпляр данного класса. Каждый раз, когда мы сохраняем объект в новой переменной, массиве и т.п. (то есть когда мы сохраняем где-то ссылку на объект), мы увеличиваем счетчик ссылок на единицу. Каждый раз, когда мы перестаем использовать переменную, удаляем объект из массива и т.п. (то есть когда ссылка на объект удаляется), мы уменьшаем счетчик ссылок на единицу. Когда он доходит до 0 — объект больше никем не используется и Python его удаляет (в том числе помещая блок, в котором располагался объект, в список пустых).

К сожалению, счетчик ссылок подвержен проблемам в многопоточной среде. Состояния гонки могут приводит к некорректности обновления этого счетчика из разных потоков. Чтобы этого избежать CPython использует GIL — Global Interpreter Lock. Каждый раз, когда происходит работа с памятью, GIL — как глобальная блокировка — препятствует выполнению этих действий одновременно из двух потоков. Он гарантирует, что сначала отработает один, потом другой.

Второй механизм очистки памяти — это сборщик мусора (garbage collector), основанный на идее поколений. Зачем он нам нужен, если есть счетчик ссылок? Дело в том, что счетчик ссылок не позволяет отслеживать ситуации с кольцевыми зависимостями, когда объект A содержит ссылку на B, а B — на A. В таком случае, даже если никто больше не ссылается на объекты A и B, их счетчик всё равно никогда не станет равным нулю и они никогда не удалятся через механизм счетчика ссылок. Для борьбы с такими зависимостями и появился второй механизм (как модуль gc, начиная с версии Python 1.5).

Работает он следующим образом: GC отслеживает объекты (объекты-контейнеры, которые могут содержать ссылки на другие объекты) и смотрит, доступны ли они из основного кода на Python. Если нет, то сборщик их удаляет. Если да — оставляет.

В отличие от счетчика ссылок, механизм сборки мусора не работает постоянно. Он запускается от случая к случаю на основе эвристик. GC разделяет объекты на три поколения. Каждый новый объект начинает свой путь с первого поколения. Если объект переживает раунд сборки мусора, он переходит к более старому поколению. В младших поколениях сборка происходит чаще, чем в старших. Эта практика является стандартной для такого рода сборщиков мусора и снижает частоту и объем очищаемых данных. Идея простая: чем дольше живет объект, тем с большей вероятностью он проживет еще. То есть новые объекты удаляются гораздо чаще, чем те, которые уже просуществовали достаточно долго.

Каждое поколение имеет индивидуальный счётчик и порог. Счетчик хранит количество созданных минус количество удаленных объектов с момента последнего сбора. Каждый раз, когда вы создаете новый объект, Python проверяет, не превысил ли счетчик поколения пороговое значение. Если это так, Python инициирует процесс сборки мусора.

Итоги

Вот так и устроен процесс работы с памятью в Python. Его понимание помогает лучше понять, как работают ваши программы внутри, а значит и писать более эффективный и высокопроизводительный код.

Эта статья посвящена работе с файлами (вводу/выводу) в Python: открытие, чтение, запись, закрытие и другие операции.

Файлы Python

Файл — это всего лишь набор данных, сохраненный в виде последовательности битов на компьютере. Информация хранится в куче данных (структура данных) и имеет название «имя файла» (filename).

В Python существует два типа файлов:

Текстовые файлы

Это файлы с человекочитаемым содержимым. В них хранятся последовательности символов, которые понимает человек. Блокнот и другие стандартные редакторы умеют читать и редактировать этот тип файлов.

Текст может храниться в двух форматах: ( .txt ) — простой текст и ( .rtf ) — «формат обогащенного текста».

Бинарные файлы

В бинарных файлах данные отображаются в закодированной форме (с использованием только нулей (0) и единиц (1) вместо простых символов). В большинстве случаев это просто последовательности битов.

Они хранятся в формате .bin .

Любую операцию с файлом можно разбить на три крупных этапа:

  1. Открытие файла
  2. Выполнение операции (запись, чтение)
  3. Закрытие файла

Открытие файла

Метод 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 = количество символов, которые нужно прочитать. Если не указать, то файл прочитается целиком.

Пример

Функция readline()

Функция readline() используется для построчного чтения содержимого файла. Она используется для крупных файлов. С ее помощью можно получать доступ к любой строке в любой момент.

Пример

Создадим файл test.txt с нескольким строками:

Посмотрим, как функция readline() работает в test.txt .

Обратите внимание, как в последнем случае строки отделены друг от друга.

Функция write()

Функция write() используется для записи в файлы Python, открытые в режиме записи.

Если пытаться открыть файл, которого не существует, в этом режиме, тогда будет создан новый.

Синтаксис

Пример

Предположим, файла xyz.txt не существует. Он будет создан при попытке открыть его в режиме чтения.

Переименование файлов в Python

Функция rename()

Функция rename() используется для переименовывания файлов в Python. Для ее использования сперва нужно импортировать модуль os.

  • src = файл, который нужно переименовать
  • dest = новое имя файла

Пример

Текущая позиция в файлах Python

В Python возможно узнать текущую позицию в файле с помощью функции tell() . Таким же образом можно изменить текущую позицию командой seek() .


Основы

Введение в тему

В данном уроке мы рассмотрим работу с файлами в Python. Вы узнаете, как их открывать, читать содержимое, вносить изменения и закрывать их.

Файлы python

Файл — это определенное количество информации, имеющее имя и хранящееся в долговременной памяти. Другими словами, это набор данных, которому дали имя и где-то сохранили.

В Питоне файлы делятся на две разновидности:

Текстовые файлы

Предполагается, что этот вид файлов содержит набор символов, который может прочитать человек. Как правило, такие файлы могут быть открыты любым простейшим текстовым редактором, к примеру, блокнотом в Виндовс.

Бинарные файлы

Бинарные файлы содержат набор нулей и единиц. Таким образом можно хранить любую информацию: изображения, аудио, видео и даже текст.

Работа с файлами состоит из следующих шагов:

Файл надо открыть

Произвести необходимые операции (запись или чтение)

Открытие файла

Метод open

И так, если Вы хотите произвести какие-либо операции с файлом, сперва придётся его открыть. Для этой цели в языке Пайтон есть встроенная функция open(). Используя эту функцию, можно создать на основе любого языка файла объект Python.

  • name- имя файла, который Вы открываете
  • mode- режим открытия. Если не указать этот параметр, файл будет открыт в режиме «только чтение». Режимы открытия файла могут быть следующими:

Файловый объект имеет несколько атрибутов, предоставляющих информацию о файле:

file.closedВыводит True если файл был закрыт.
file.modeВыводит режим доступа, с которым был открыт файл.
file.nameВыводит имя файла.
file.softspaceВыводит False если при выводе содержимого файла следует отдельно добавлять пробел.

Пример

Для начала необходимо сохранить в новый файл «test.txt» какой-то текст. Этот файл должен быть расположен в рабочей папке.

Применим следующий код для открытия данного файла:


В переменных file и file_2 хранятся ссылки на объекты с открытыми файлами.

Теперь посмотрим содержимое файла и информацию о нём:

Закрытие файла

Метод close

Когда файл открывается, он начинает потреблять дополнительные ресурсы, поэтому, после выполнения всех операций, его необходимо закрыть.

Python сам закроет файл, если присвоить объект другому файлу.

Так же можно использовать метод close().

Инструкция with

Конструкция with называется менеджер контекста.

Обратите внимание, насколько это интуитивно понятно. Оператор Python with всегда будет закрывать файл в конце, даже если программа завершилась ненормально даже в контексте или блоке. Эта функция безопасности рекомендуемый выбор для всех программистов.
В таком случае инструкция close не нужна, потому что with автоматически закроет файл.

Пример использование менеджера контекста:

Чтение и запись файлов в python

Пайтон позволяет как читать, так и записывать в файлы информацию. Для этого при открытии применяются различные режимы.

Функция read

Применяя функцию read() Вы можете прочесть информацию из файл, который был открыт в режиме чтения (r):

Читайте также: