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

mmap.md

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

1> **Источник:** https://python-all.ru/2.7/library/mmap.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 16.7. [`mmap`](https://python-all.ru/2.7/library/mmap.html#module-mmap) – Поддержка отображаемых в память файлов89Объекты файлов с отображением в память ведут себя и как строки, и как файловые объекты. Однако, в отличие от обычных строк, они изменяемы. Объекты mmap можно использовать в большинстве мест, где ожидаются строки; например, можно воспользоваться модулем [`re`](https://python-all.ru/2.7/library/re.html#module-re) для поиска в файле с отображением в память. Поскольку они изменяемы, можно изменить один символ с помощью `obj[index] = 'a'`, или изменить подстроку, присвоив значение срезу: `obj[i1:i2] = '...'`. Также можно читать и записывать данные, начиная с текущей позиции в файле, и `seek()` по файлу в разные позиции.1011Файл с отображением в память создаётся конструктором [`mmap`](https://python-all.ru/2.7/library/mmap.html#mmap.mmap), который отличается на Unix и Windows. В любом случае необходимо предоставить файловый дескриптор файла, открытого для обновления. Если требуется отобразить существующий файловый объект Python, используйте его метод `fileno()`, чтобы получить правильное значение параметра *fileno*. В противном случае можно открыть файл с помощью функции [`os.open()`](https://python-all.ru/2.7/library/os.html#os.open), которая напрямую возвращает файловый дескриптор (файл всё равно нужно закрыть после использования).1213> **Примечание**14>15> Если нужно создать отображение в память для буферизованного файла, доступного для записи, сначала следует [`flush()`](https://python-all.ru/2.7/library/io.html#io.IOBase.flush) файл. Это необходимо, чтобы локальные изменения в буферах были доступны для отображения.1617Для версий конструктора под Unix и Windows параметр *access* может быть указан как необязательный именованный аргумент. *access* принимает одно из трёх значений: `ACCESS_READ`, `ACCESS_WRITE` или `ACCESS_COPY`, задающих соответственно память только для чтения, сквозную запись или копирование при записи. *access* можно использовать и в Unix, и в Windows. Если *access* не указан, Windows mmap создаёт отображение со сквозной записью. Начальные значения памяти для всех трёх типов доступа берутся из указанного файла. Присваивание отображаемой в память области с доступом `ACCESS_READ` вызывает исключение [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Присваивание области с доступом `ACCESS_WRITE` затрагивает как память, так и нижележащий файл. Присваивание области с доступом `ACCESS_COPY` затрагивает память, но не обновляет нижележащий файл.1819Изменено в версии 2.5: Для отображения анонимной памяти в качестве fileno следует передавать -1 вместе с длиной.2021Изменено в версии 2.6: Раньше mmap.mmap была фабричной функцией, создающей объекты mmap. Теперь mmap.mmap – это сам класс.2223#### `class mmap.mmap(fileno, length[, tagname[, access[, offset]]])`2425**(Версия Windows)** Отображает *length* байтов из файла, указанного файловым дескриптором *fileno*, и создаёт объект mmap. Если *length* больше текущего размера файла, файл расширяется до *length* байтов. Если *length* равно `0`, максимальная длина отображения равна текущему размеру файла, за исключением случая, когда файл пуст – тогда Windows вызывает исключение (нельзя создать пустое отображение в Windows).2627*tagname*, если указан и не равен `None`, представляет собой строку, задающую имя тега для отображения. Windows позволяет иметь много разных отображений одного и того же файла. Если указать имя существующего тега, этот тег открывается, иначе создаётся новый тег с таким именем. Если этот параметр опущен или равен `None`, отображение создаётся без имени. Отказ от использования параметра tag поможет сохранить переносимость кода между Unix и Windows.2829*offset* может быть указан как неотрицательное целое смещение. Ссылки mmap будут относительными к смещению от начала файла. *offset* по умолчанию равен 0. *offset* должен быть кратен `ALLOCATIONGRANULARITY`.3031#### `class mmap.mmap(fileno, length[, flags[, prot[, access[, offset]]]])`3233**(Версия Unix)** Отображает *length* байтов из файла, указанного файловым дескриптором *fileno*, и возвращает объект mmap. Если *length* равно `0`, максимальная длина отображения будет равна текущему размеру файла на момент вызова [`mmap`](https://python-all.ru/2.7/library/mmap.html#mmap.mmap).3435*flags* задаёт характер отображения. `MAP_PRIVATE` создаёт частное отображение с копированием при записи, поэтому изменения содержимого mmap-объекта будут частными для этого процесса, а `MAP_SHARED` создаёт отображение, разделяемое со всеми другими процессами, отображающими те же области файла. Значение по умолчанию – `MAP_SHARED`.3637*prot*, если указан, задаёт желаемую защиту памяти; два наиболее полезных значения – `PROT_READ` и `PROT_WRITE`, чтобы указать, что страницы можно читать или записывать. *prot* по умолчанию равен `PROT_READ | PROT_WRITE`.3839*access* может быть указан вместо *flags* и *prot* как необязательный именованный параметр. Указывать одновременно *flags*, *prot* и *access* – ошибка. Информацию о том, как использовать этот параметр, см. в описании *access* выше.4041*offset* может быть указан как неотрицательное целое смещение. Ссылки mmap будут относительными к смещению от начала файла. *offset* по умолчанию равен 0. *offset* должен быть кратен `ALLOCATIONGRANULARITY`, что в системах Unix равно `PAGESIZE`.4243Для обеспечения корректности созданного отображения в память файл, заданный дескриптором *fileno*, внутренне автоматически синхронизируется с физическим хранилищем на Mac OS X и OpenVMS.4445В этом примере показан простой способ использования [`mmap`](https://python-all.ru/2.7/library/mmap.html#mmap.mmap):4647```python48import mmap4950# записать простой пример файла51with open("hello.txt", "wb") as f:52    f.write("Hello Python!\n")5354with open("hello.txt", "r+b") as f:55    # отобразить файл в память, размер 0 означает весь файл56    mm = mmap.mmap(f.fileno(), 0)57    # прочитать содержимое с помощью стандартных методов файла58    print mm.readline()  # выводит "Hello Python!"59    # чтение содержимого с помощью срезовой нотации60    print mm[:5]  # выводит "Hello"61    # обновление содержимого с помощью срезовой нотации;62    # новое содержимое должно быть того же размера63    mm[6:] = " world!\n"64    # ... и снова прочитать стандартными методами файлов65    mm.seek(0)66    print mm.readline()  # выводит "Hello  world!"67    # закрыть отображение68    mm.close()69```7071Следующий пример демонстрирует, как создать анонимное отображение и обмениваться данными между родительским и дочерним процессами:7273```python74import mmap75import os7677mm = mmap.mmap(-1, 13)78mm.write("Hello world!")7980pid = os.fork()8182if pid == 0:  # В дочернем процессе83    mm.seek(0)84    print mm.readline()8586    mm.close()87```8889Объекты файлов с отображением в память поддерживают следующие методы:9091#### `close()`9293Закрывает mmap. Последующие вызовы других методов объекта приведут к возникновению исключения ValueError. Открытый файл при этом не закрывается.9495#### `find(string[, start[, end]])`9697Возвращает наименьший индекс в объекте, где подстрока *string* найдена, такой, что *string* содержится в диапазоне \[*start*, *end*\]. Необязательные аргументы *start* и *end* интерпретируются как в нотации срезов. Возвращает `-1` в случае неудачи.9899#### `flush([offset, size])`100101Сбрасывает изменения, внесённые в копию файла в памяти, обратно на диск. Без использования этого вызова нет гарантии, что изменения будут записаны до того, как объект будет уничтожен. Если *offset* и *size* заданы, на диск будут сброшены только изменения в указанном диапазоне байтов; в противном случае сбрасывается вся область отображения. *offset* должен быть кратен `PAGESIZE` или `ALLOCATIONGRANULARITY`.102103**(версия Windows)** Ненулевое возвращённое значение означает успех; нулевое – неудачу.104105**(версия Unix)** Возвращается нулевое значение, означающее успех. При ошибке вызова возбуждается исключение.106107#### `move(dest, src, count)`108109Копирует *count* байт, начиная со смещения *src*, в индекс назначения *dest*. Если mmap был создан с `ACCESS_READ`, то вызовы move вызовут исключение [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).110111#### `read(num)`112113Возвращает строку, содержащую до *num* байт, начиная с текущей позиции файла; позиция файла обновляется так, чтобы указывать за байтами, которые были возвращены.114115#### `read_byte()`116117Возвращает строку длиной 1, содержащую символ на текущей позиции файла, и увеличивает позицию файла на 1.118119#### `readline()`120121Возвращает одну строку, начиная с текущей позиции в файле и до следующего символа новой строки.122123#### `resize(newsize)`124125Изменяет размер отображения и соответствующего файла, если таковой имеется. Если mmap был создан с помощью `ACCESS_READ` или `ACCESS_COPY`, изменение размера отображения вызовет исключение [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).126127#### `rfind(string[, start[, end]])`128129Возвращает наибольший индекс в объекте, где подстрока *string* найдена, такой, что *string* содержится в диапазоне \[*start*, *end*\]. Необязательные аргументы *start* и *end* интерпретируются как в нотации срезов. Возвращает `-1` в случае неудачи.130131#### `seek(pos[, whence])`132133Устанавливает текущую позицию в файле. Аргумент *whence* необязателен и по умолчанию равен `os.SEEK_SET` или `0` (абсолютное позиционирование); другие значения: `os.SEEK_CUR` или `1` (смещение относительно текущей позиции) и `os.SEEK_END` или `2` (смещение относительно конца файла).134135#### `size()`136137Возвращает длину файла, которая может быть больше размера области отображения памяти.138139#### `tell()`140141Возвращает текущую позицию файлового указателя.142143#### `write(string)`144145Записывает байты из *string* в память в текущей позиции файлового указателя; позиция файла обновляется так, чтобы указывать после записанных байтов. Если mmap был создан с `ACCESS_READ`, то запись вызовет исключение [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).146147#### `write_byte(byte)`148149Записывает односимвольную строку *byte* в память в текущей позиции файлового указателя; позиция файла увеличивается на `1`. Если mmap был создан с `ACCESS_READ`, то запись вызовет исключение [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).150