18.10. 多文件—支持包含不同部分的文件

从版本 2.5 开始不推荐使用:email软件包应优先于multifile模块使用。仅提供此模块是为了保持向后兼容性。

MultiFile对象使您可以将文本文件的各个部分视为类似于文件的 Importing 对象,当遇到给定的定界符模式时,readline()返回''。此类的默认设置旨在使它可用于解析 MIMEMultipart 消息,但是pass将其子类化并覆盖方法,可以轻松地将其改编为更广泛的用途。

MultiFile仅查看 Importing 对象的readline()seek()tell()方法,仅当您要随机访问各个 MIME 部分时才需要后两个方法。要在不可搜索的流对象上使用MultiFile,请将可选的* seekable *参数设置为 false;这将防止使用 Importing 对象的seek()tell()方法。

知道在MultiFile的世界视图中,文本由三行组成:数据,节分隔符和结束标记。 MultiFile 旨在支持对可能具有多个嵌套消息部分的消息进行解析,每个消息部分都有其自己的节分割线和结束标记线模式。

See also

  • Module email

  • 全面的电子邮件处理包;取代multifile模块。

18.10.1. 多文件对象

MultiFile实例具有以下方法:

请注意,此测试旨在用作实际边界测试的快速防护。如果它始终返回 false,则只会减慢处理速度,而不会导致失败。

可以推动多个边界。遇到最近推入的边界将返回 EOF;遇到任何其他边界都会引发错误。

最后,MultiFile个实例具有两个公共实例变量:

18.10.2. 多文件示例

import mimetools
import multifile
import StringIO

def extract_mime_part_matching(stream, mimetype):
    """Return the first element in a multipart MIME message on stream
    matching mimetype."""

    msg = mimetools.Message(stream)
    msgtype = msg.gettype()
    params = msg.getplist()

    data = StringIO.StringIO()
    if msgtype[:10] == "multipart/":

        file = multifile.MultiFile(stream)
        file.push(msg.getparam("boundary"))
        while file.next():
            submsg = mimetools.Message(file)
            try:
                data = StringIO.StringIO()
                mimetools.decode(file, data, submsg.getencoding())
            except ValueError:
                continue
            if submsg.gettype() == mimetype:
                break
        file.pop()
    return data.getvalue()
首页