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

multifile.md

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

1> **Источник:** https://python-all.ru/2.7/library/multifile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.10. [`multifile`](https://python-all.ru/2.7/library/multifile.html#module-multifile) – поддержка файлов, содержащих отдельные части89Устарело с версии 2.5: Следует использовать пакет [`email`](https://python-all.ru/2.7/library/email.html#module-email) вместо модуля [`multifile`](https://python-all.ru/2.7/library/multifile.html#module-multifile). Этот модуль присутствует только для сохранения обратной совместимости.1011Объект [`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) позволяет обрабатывать разделы текстового файла как файлоподобные объекты ввода, при этом `''` возвращается [`readline()`](https://python-all.ru/2.7/library/readline.html#module-readline) при обнаружении заданного шаблона-разделителя. Значения по умолчанию этого класса предназначены для использования при разборе MIME-сообщений с несколькими частями, но с помощью создания подкласса и переопределения методов его можно легко адаптировать для более общего использования.1213#### `class multifile.MultiFile(fp[, seekable])`1415Создаёт multi-file. Необходимо создать экземпляр этого класса с аргументом – объектом ввода, из которого экземпляр [`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) будет получать строки, например, файловым объектом, возвращаемым [`open()`](https://python-all.ru/2.7/library/functions.html#open).1617[`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) всегда использует только методы [`readline()`](https://python-all.ru/2.7/library/readline.html#module-readline), [`seek()`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile.seek) и [`tell()`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile.tell) входного объекта, причём последние два нужны только для произвольного доступа к отдельным MIME-частям. Чтобы использовать [`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) с непозиционируемым потоковым объектом, установите необязательный аргумент *seekable* в false; это предотвратит использование методов [`seek()`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile.seek) и [`tell()`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile.tell) входного объекта.1819Полезно знать, что в представлении [`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) текст состоит из трёх видов строк: данных, разделителей разделов и конечных маркеров. MultiFile предназначен для поддержки разбора сообщений, которые могут содержать несколько вложенных частей, каждая со своим шаблоном строк-разделителей и конечных маркеров.2021> **См. также**22>23> **Модуль [`email`](https://python-all.ru/2.7/library/email.html#module-email)**24>25> Комплексный пакет для обработки электронной почты; заменяет модуль [`multifile`](https://python-all.ru/2.7/library/multifile.html#module-multifile).2627## 18.10.1. Объекты MultiFile2829Экземпляр [`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) имеет следующие методы:3031#### `MultiFile.readline(str)`3233Читает строку. Если строка является данными (не разделителем раздела, не конечным маркером и не реальным концом файла), возвращает её. Если строка соответствует самой последней помещённой в стек границе, возвращает `''` и устанавливает `self.last` в 1 или 0 в зависимости от того, является ли совпадение конечным маркером. Если строка соответствует любой другой границе из стека, вызывает исключение. При достижении конца файла в нижележащем потоковом объекте метод вызывает `Error`, если только все границы не были извлечены из стека.3435#### `MultiFile.readlines(str)`3637Возвращает все строки, оставшиеся в этой части, в виде списка строк.3839#### `MultiFile.read()`4041Читает все строки до следующего раздела. Возвращает их в виде одной (многострочной) строки. Обратите внимание: этот метод не принимает аргумент размера!4243#### `MultiFile.seek(pos[, whence])`4445Позиционирование. Индексы позиционирования задаются относительно начала текущего раздела. Аргументы *pos* и *whence* интерпретируются так же, как при позиционировании в файле.4647#### `MultiFile.tell()`4849Возвращает позицию в файле относительно начала текущего раздела.5051#### `MultiFile.next()`5253Пропускает строки до следующего раздела (то есть читает строки, пока не будет поглощён разделитель раздела или конечный маркер). Возвращает true, если такой раздел существует, и false, если обнаружен конечный маркер. Повторно активирует самую последнюю помещённую границу.5455#### `MultiFile.is_data(str)`5657Возвращает true, если *str* является данными, и false, если это может быть границей раздела. В текущей реализации проверяет, не начинается ли строка с префикса `'-``-'` (который есть у всех MIME-границ), но объявлена так, чтобы её можно было переопределить в производных классах.5859Обратите внимание: эта проверка используется как быстрый предохранитель перед настоящими проверками границ; если она всегда возвращает false, это лишь замедлит обработку, но не приведёт к сбою.6061#### `MultiFile.push(str)`6263Помещает строку границы в стек. Когда во входной строке встречается оформленная версия этой границы, она интерпретируется как разделитель раздела или конечный маркер (в зависимости от оформления, см. [**RFC 2045**](https://python-all.ru/2.7/library/multifile.html)). Все последующие чтения будут возвращать пустую строку, указывая на конец файла, пока вызов [`pop()`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile.pop) не удалит границу, или вызов [`next()`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile.next) не активирует её повторно.6465Можно поместить в стек несколько границ. Обнаружение самой последней помещённой границы вернёт EOF; обнаружение любой другой границы вызовет исключение.6667#### `MultiFile.pop()`6869Извлекает границу раздела из стека. Эта граница больше не будет интерпретироваться как EOF.7071#### `MultiFile.section_divider(str)`7273Преобразует границу в строку-разделитель раздела. По умолчанию этот метод добавляет в начало `'--'` (который есть у MIME-границ разделов), но объявлен так, чтобы его можно было переопределить в производных классах. Этот метод не должен добавлять LF или CR-LF, так как сравнение результата игнорирует завершающие пробельные символы.7475#### `MultiFile.end_marker(str)`7677Преобразует строку границы в строку конечного маркера. По умолчанию этот метод добавляет в начало `'--'` и в конец `'--'` (как маркер конца сообщения MIME-многокомпонентного сообщения), но объявлен так, чтобы его можно было переопределить в производных классах. Этот метод не должен добавлять LF или CR-LF, так как сравнение результата игнорирует завершающие пробельные символы.7879Наконец, экземпляры [`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) имеют две открытые переменные экземпляра:8081#### `MultiFile.level`8283Глубина вложенности текущей части.8485#### `MultiFile.last`8687True, если последний конец файла был маркером конца сообщения.8889## 18.10.2. [`MultiFile`](https://python-all.ru/2.7/library/multifile.html#multifile.MultiFile) Пример9091```python92import mimetools93import multifile94import StringIO9596def extract_mime_part_matching(stream, mimetype):97    """Возвращает первый элемент многочастного MIME-сообщения в потоке98    соответствующий MIME-тип."""99100    msg = mimetools.Message(stream)101    msgtype = msg.gettype()102    params = msg.getplist()103104    data = StringIO.StringIO()105    if msgtype[:10] == "multipart/":106107        file = multifile.MultiFile(stream)108        file.push(msg.getparam("boundary"))109        while file.next():110            submsg = mimetools.Message(file)111            try:112                data = StringIO.StringIO()113                mimetools.decode(file, data, submsg.getencoding())114            except ValueError:115                continue116            if submsg.gettype() == mimetype:117                break118        file.pop()119    return data.getvalue()120```121