Документация Python неофициальный перевод

mmap.md

267 строк · 21.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.10/library/mmap.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`mmap`](https://python-all.ru/3.10/library/mmap.html#module-mmap) – Поддержка файлов с отображением в память89---1011Объекты файлов с отображением в память ведут себя и как [`bytearray`](https://python-all.ru/3.10/library/stdtypes.html#bytearray), и как [файловые объекты](https://python-all.ru/3.10/glossary.html#term-file-object). Объекты mmap можно использовать почти везде, где ожидаются [`bytearray`](https://python-all.ru/3.10/library/stdtypes.html#bytearray); например, можно использовать модуль [`re`](https://python-all.ru/3.10/library/re.html#module-re) для поиска в файле с отображением в память. Также можно изменить один байт, выполнив `obj[index] = 97`, или изменить подпоследовательность, присвоив значение срезу: `obj[i1:i2] = b'...'`. Кроме того, можно читать и записывать данные, начиная с текущей позиции в файле, и `seek()` по файлу в разные позиции.1213Файл с отображением в память создаётся конструктором [`mmap`](https://python-all.ru/3.10/library/mmap.html#mmap.mmap), который отличается на Unix и Windows. В любом случае необходимо предоставить файловый дескриптор файла, открытого для обновления. Если требуется отобразить существующий файловый объект Python, используйте его метод `fileno()`, чтобы получить правильное значение параметра *fileno*. В противном случае можно открыть файл с помощью функции [`os.open()`](https://python-all.ru/3.10/library/os.html#os.open), которая напрямую возвращает файловый дескриптор (файл всё равно нужно закрыть после использования).1415> **Примечание**16>17> Если нужно создать отображение в память для буферизованного файла, доступного для записи, сначала следует [`flush()`](https://python-all.ru/3.10/library/io.html#io.IOBase.flush) файл. Это необходимо, чтобы локальные изменения в буферах были доступны для отображения.1819Для версий конструктора как для Unix, так и для Windows, *access* может быть указан как необязательный именованный параметр. *access* принимает одно из четырёх значений: `ACCESS_READ`, `ACCESS_WRITE` или `ACCESS_COPY` для указания памяти только для чтения, сквозной записи или копирования при записи соответственно, или `ACCESS_DEFAULT`, чтобы обратиться к *prot*. *access* можно использовать как в Unix, так и в Windows. Если *access* не задан, Windows mmap возвращает отображение со сквозной записью. Начальные значения памяти для всех трёх типов доступа берутся из указанного файла. Присваивание `ACCESS_READ` отображению памяти вызывает исключение [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError). Присваивание `ACCESS_WRITE` отображению памяти влияет и на память, и на базовый файл. Присваивание `ACCESS_COPY` отображению памяти влияет на память, но не обновляет базовый файл.2021Изменено в версии 3.7: Добавлена константа `ACCESS_DEFAULT`.2223Для отображения анонимной памяти в качестве fileno следует передать -1 вместе с длиной.2425#### `class mmap.mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset])`2627**(Версия Windows)** Отображает *length* байтов из файла, указанного файловым дескриптором *fileno*, и создаёт объект mmap. Если *length* больше текущего размера файла, файл расширяется до *length* байтов. Если *length* равно `0`, максимальная длина отображения равна текущему размеру файла, за исключением случая, когда файл пуст – тогда Windows вызывает исключение (нельзя создать пустое отображение в Windows).2829*tagname*, если указан и не равен `None`, представляет собой строку, задающую имя тега для отображения. Windows позволяет иметь много разных отображений одного и того же файла. Если указать имя существующего тега, этот тег открывается, иначе создаётся новый тег с таким именем. Если этот параметр опущен или равен `None`, отображение создаётся без имени. Отказ от использования параметра tag поможет сохранить переносимость кода между Unix и Windows.3031*offset* может быть указан как неотрицательное целое смещение. Ссылки mmap будут относительными к смещению от начала файла. *offset* по умолчанию равен 0. *offset* должен быть кратен `ALLOCATIONGRANULARITY`.3233Возбуждает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `mmap.__new__` с аргументами `fileno`, `length`, `access`, `offset`.3435#### `class mmap.mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])`3637**(Версия Unix)** Отображает *length* байтов из файла, указанного файловым дескриптором *fileno*, и возвращает объект mmap. Если *length* равно `0`, максимальная длина отображения будет равна текущему размеру файла на момент вызова [`mmap`](https://python-all.ru/3.10/library/mmap.html#mmap.mmap).3839*flags* задаёт характер отображения. [`MAP_PRIVATE`](https://python-all.ru/3.10/library/mmap.html#mmap.MAP_PRIVATE) создаёт частное отображение с копированием при записи, поэтому изменения содержимого объекта mmap будут приватными для этого процесса, а [`MAP_SHARED`](https://python-all.ru/3.10/library/mmap.html#mmap.MAP_SHARED) создаёт отображение, разделяемое со всеми другими процессами, отображающими те же области файла. Значение по умолчанию – [`MAP_SHARED`](https://python-all.ru/3.10/library/mmap.html#mmap.MAP_SHARED). В некоторых системах есть дополнительные возможные флаги; полный список указан в [константах MAP\_\*](https://python-all.ru/3.10/library/mmap.html#map-constants).4041*prot*, если указан, задаёт желаемую защиту памяти; два наиболее полезных значения – `PROT_READ` и `PROT_WRITE`, чтобы указать, что страницы можно читать или записывать. *prot* по умолчанию равен `PROT_READ | PROT_WRITE`.4243*access* может быть указан вместо *flags* и *prot* как необязательный именованный параметр. Указывать одновременно *flags*, *prot* и *access* – ошибка. Информацию о том, как использовать этот параметр, см. в описании *access* выше.4445*offset* может быть указан как неотрицательное целое смещение. Ссылки mmap будут относительными к смещению от начала файла. *offset* по умолчанию равен 0. *offset* должен быть кратен `ALLOCATIONGRANULARITY`, что в системах Unix равно `PAGESIZE`.4647Чтобы обеспечить корректность созданного отображения памяти, файл, указанный дескриптором *fileno*, на macOS автоматически синхронизируется с физическим хранилищем.4849В этом примере показан простой способ использования [`mmap`](https://python-all.ru/3.10/library/mmap.html#mmap.mmap):5051```python52import mmap5354# записать простой пример файла55with open("hello.txt", "wb") as f:56    f.write(b"Hello Python!\n")5758with open("hello.txt", "r+b") as f:59    # отобразить файл в память, размер 0 означает весь файл60    mm = mmap.mmap(f.fileno(), 0)61    # прочитать содержимое с помощью стандартных методов файла62    print(mm.readline())  # выводит b"Hello Python!\n"63    # чтение содержимого с помощью срезовой нотации64    print(mm[:5])  # выводит b"Hello"65    # обновление содержимого с помощью срезовой нотации;66    # новое содержимое должно быть того же размера67    mm[6:] = b" world!\n"68    # ... и снова прочитать стандартными методами файлов69    mm.seek(0)70    print(mm.readline())  # выводит b"Hello  world!\n"71    # закрыть отображение72    mm.close()73```7475[`mmap`](https://python-all.ru/3.10/library/mmap.html#mmap.mmap) также можно использовать как контекстный менеджер в операторе [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with):7677```python78import mmap7980with mmap.mmap(-1, 13) as mm:81    mm.write(b"Hello world!")82```8384Новое в версии 3.2: Поддержка контекстного менеджера.8586Следующий пример демонстрирует, как создать анонимное отображение и обмениваться данными между родительским и дочерним процессами:8788```python89import mmap90import os9192mm = mmap.mmap(-1, 13)93mm.write(b"Hello world!")9495pid = os.fork()9697if pid == 0:  # В дочернем процессе98    mm.seek(0)99    print(mm.readline())100101    mm.close()102```103104Возбуждает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `mmap.__new__` с аргументами `fileno`, `length`, `access`, `offset`.105106Объекты файлов с отображением в память поддерживают следующие методы:107108#### `close()`109110Закрывает mmap. Последующие вызовы других методов объекта приведут к возникновению исключения ValueError. Открытый файл при этом не закрывается.111112#### `closed`113114`True`, если файл закрыт.115116Новое в версии 3.2.117118#### `find(sub[, start[, end]])`119120Возвращает наименьший индекс в объекте, где встречается подпоследовательность *sub*, при условии, что *sub* содержится в диапазоне \[*start*, *end*\]. Необязательные аргументы *start* и *end* интерпретируются как в записи среза. В случае неудачи возвращает `-1`.121122Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.10/glossary.html#term-bytes-like-object).123124#### `flush([offset[, size]])`125126Сбрасывает изменения, внесённые в копию файла в памяти, обратно на диск. Без использования этого вызова нет гарантии, что изменения будут записаны до того, как объект будет уничтожен. Если *offset* и *size* заданы, на диск будут сброшены только изменения в указанном диапазоне байтов; в противном случае сбрасывается вся область отображения. *offset* должен быть кратен `PAGESIZE` или `ALLOCATIONGRANULARITY`.127128`None` возвращается в случае успеха. Исключение возбуждается, если вызов завершился неудачей.129130Изменено в версии 3.8: Ранее возвращалось ненулевое значение при успехе; под Windows возвращался нуль при ошибке. Под Unix возвращался нуль при успехе и возбуждалось исключение при ошибке.131132#### `madvise(option[, start[, length]])`133134Отправляет ядру рекомендацию *option* для области памяти, начинающейся с *start* и простирающейся на *length* байт. *option* должен быть одной из констант [MADV\_\* constants](https://python-all.ru/3.10/library/mmap.html#madvise-constants), доступных в системе. Если *start* и *length* опущены, затрагивается всё отображение. На некоторых системах (включая Linux) *start* должен быть кратен `PAGESIZE`.135136Доступность: системы с системным вызовом `madvise()`.137138Новое в версии 3.8.139140#### `move(dest, src, count)`141142Копирует *count* байт, начиная со смещения *src*, в индекс назначения *dest*. Если mmap был создан с `ACCESS_READ`, то вызовы move вызовут исключение [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError).143144#### `read([n])`145146Возвращает [`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes), содержащий до *n* байт, начиная с текущей позиции в файле. Если аргумент опущен, равен `None` или отрицательному значению, возвращаются все байты от текущей позиции до конца отображения. Позиция в файле обновляется так, чтобы указывать на байты после возвращённых.147148Изменено в версии 3.3: Аргумент можно опустить или задать `None`.149150#### `read_byte()`151152Возвращает байт в текущей позиции файла в виде целого числа и увеличивает позицию файла на 1.153154#### `readline()`155156Возвращает одну строку, начиная с текущей позиции файла и до следующего символа новой строки. Позиция файла обновляется так, чтобы указывать на байты после возвращённых.157158#### `resize(newsize)`159160Изменяет размер отображения и соответствующего файла, если таковой имеется. Если mmap был создан с помощью `ACCESS_READ` или `ACCESS_COPY`, изменение размера отображения вызовет исключение [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError).161162#### `rfind(sub[, start[, end]])`163164Возвращает наибольший индекс в объекте, где найдена подпоследовательность *sub*, такой, что *sub* содержится в диапазоне \[*start*, *end*\]. Необязательные аргументы *start* и *end* интерпретируются как в нотации среза. Возвращает `-1` при неудаче.165166Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.10/glossary.html#term-bytes-like-object).167168#### `seek(pos[, whence])`169170Устанавливает текущую позицию в файле. Аргумент *whence* необязателен и по умолчанию равен `os.SEEK_SET` или `0` (абсолютное позиционирование); другие значения: `os.SEEK_CUR` или `1` (смещение относительно текущей позиции) и `os.SEEK_END` или `2` (смещение относительно конца файла).171172#### `size()`173174Возвращает длину файла, которая может быть больше размера области отображения памяти.175176#### `tell()`177178Возвращает текущую позицию файлового указателя.179180#### `write(bytes)`181182Записывает байты из *bytes* в память в текущей позиции файлового указателя и возвращает количество записанных байт (всегда не меньше `len(bytes)`, так как в случае ошибки записи будет возбуждено исключение [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError)). Позиция файла обновляется и указывает на байт сразу после записанных. Если отображение mmap было создано с `ACCESS_READ`, то запись в него вызовет исключение [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError).183184Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.10/glossary.html#term-bytes-like-object).185186Изменено в версии 3.6: Теперь возвращается количество записанных байт.187188#### `write_byte(byte)`189190Записывает целое число *byte* в память в текущей позиции файлового указателя; позиция файла увеличивается на `1`. Если отображение mmap было создано с `ACCESS_READ`, то запись в него вызовет исключение [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError).191192## Константы MADV\_\*193194#### `mmap.MADV_NORMAL`195196#### `mmap.MADV_RANDOM`197198#### `mmap.MADV_SEQUENTIAL`199200#### `mmap.MADV_WILLNEED`201202#### `mmap.MADV_DONTNEED`203204#### `mmap.MADV_REMOVE`205206#### `mmap.MADV_DONTFORK`207208#### `mmap.MADV_DOFORK`209210#### `mmap.MADV_HWPOISON`211212#### `mmap.MADV_MERGEABLE`213214#### `mmap.MADV_UNMERGEABLE`215216#### `mmap.MADV_SOFT_OFFLINE`217218#### `mmap.MADV_HUGEPAGE`219220#### `mmap.MADV_NOHUGEPAGE`221222#### `mmap.MADV_DONTDUMP`223224#### `mmap.MADV_DODUMP`225226#### `mmap.MADV_FREE`227228#### `mmap.MADV_NOSYNC`229230#### `mmap.MADV_AUTOSYNC`231232#### `mmap.MADV_NOCORE`233234#### `mmap.MADV_CORE`235236#### `mmap.MADV_PROTECT`237238#### `mmap.MADV_FREE_REUSABLE`239240#### `mmap.MADV_FREE_REUSE`241242Эти параметры можно передать [`mmap.madvise()`](https://python-all.ru/3.10/library/mmap.html#mmap.mmap.madvise). Не все параметры доступны на всех системах.243244Доступность: системы с системным вызовом madvise().245246Новое в версии 3.8.247248## Константы MAP\_\*249250#### `mmap.MAP_SHARED`251252#### `mmap.MAP_PRIVATE`253254#### `mmap.MAP_DENYWRITE`255256#### `mmap.MAP_EXECUTABLE`257258#### `mmap.MAP_ANON`259260#### `mmap.MAP_ANONYMOUS`261262#### `mmap.MAP_POPULATE`263264Это различные флаги, которые можно передать в [`mmap.mmap()`](https://python-all.ru/3.10/library/mmap.html#mmap.mmap). Обратите внимание: некоторые параметры могут отсутствовать в некоторых системах.265266Изменено в версии 3.10: Добавлена константа MAP\_POPULATE.267