18.10. multifile —個別の部分を含むファイルのサポート—Pythonドキュメント
18.10。 マルチファイル —個別の部分を含むファイルのサポート
MultiFile オブジェクトを使用すると、テキストファイルのセクションをファイルのような入力オブジェクトとして扱うことができます。指定された区切り文字パターンが readline()の場合、が返されます。遭遇しました。 このクラスのデフォルトは、MIMEマルチパートメッセージの解析に役立つように設計されていますが、サブクラス化してメソッドをオーバーライドすることにより、より一般的な使用に簡単に適合させることができます。
- class multifile.MultiFile(fp[, seekable])
マルチファイルを作成します。 open()によって返されるファイルオブジェクトなど、行を取得するには、 MultiFile インスタンスの入力オブジェクト引数を使用してこのクラスをインスタンス化する必要があります。
MultiFile は、入力オブジェクトの readline()、 seek()、および tell()メソッドのみを調べ、後者の2つは個々のMIMEパーツにランダムアクセスする場合にのみ必要です。 シーク不可能なストリームオブジェクトで MultiFile を使用するには、オプションの seekable 引数をfalseに設定します。 これにより、入力オブジェクトの seek()および tell()メソッドを使用できなくなります。
MultiFile の世界観では、テキストはデータ、セクションディバイダー、エンドマーカーの3種類の行で構成されていることを知っておくと便利です。 MultiFileは、複数のネストされたメッセージ部分を持つ可能性のあるメッセージの解析をサポートするように設計されており、それぞれにセクションディバイダーとエンドマーカー行の独自のパターンがあります。
18.10.1。 マルチファイルオブジェクト
MultiFile インスタンスには次のメソッドがあります。
- MultiFile.readline(str)
- 行を読んでください。 行がデータ(セクションディバイダー、エンドマーカー、または実際のEOFではない)の場合は、それを返します。 線が最近スタックされた境界と一致する場合は、
を返し、一致がエンドマーカーであるかどうかに応じて、
self.last
を1または0に設定します。 線が他の積み重ねられた境界と一致する場合は、エラーを発生させます。 基になるストリームオブジェクトでファイルの終わりに遭遇すると、すべての境界がポップされていない限り、メソッドはError
を発生させます。
- MultiFile.readlines(str)
- この部分に残っているすべての行を文字列のリストとして返します。
- MultiFile.read()
- 次のセクションまで、すべての行を読んでください。 それらを単一の(複数行の)文字列として返します。 これはサイズ引数をとらないことに注意してください!
- MultiFile.seek(pos[, whence])
- 求める。 シークインデックスは、現在のセクションの開始を基準にしています。 pos および whence 引数は、ファイルシークの場合と同様に解釈されます。
- MultiFile.tell()
- 現在のセクションの先頭を基準にしたファイルの位置を返します。
- MultiFile.next()
- 次のセクションへの行をスキップします(つまり、セクションディバイダーまたはエンドマーカーが消費されるまで行を読み取ります)。 そのようなセクションがある場合はtrueを返し、エンドマーカーが表示されている場合はfalseを返します。 最近プッシュされた境界を再度有効にします。
- MultiFile.is_data(str)
str がデータの場合はtrueを返し、セクション境界の場合はfalseを返します。 記述されているように、行の先頭(すべてのMIME境界にある)で
'-
-'
以外のプレフィックスをテストしますが、派生クラスでオーバーライドできるように宣言されています。このテストは、実際の境界テストの高速ガードとして使用されることに注意してください。 常にfalseを返す場合は、処理が遅くなるだけで、失敗することはありません。
- MultiFile.push(str)
境界文字列をプッシュします。 この境界の装飾されたバージョンが入力行として見つかると、セクションディバイダーまたはエンドマーカーとして解釈されます(装飾に応じて、 RFC 2045 を参照)。 pop()を呼び出すと境界が削除されるか、 next()を呼び出すと再び有効になるまで、以降のすべての読み取りでファイルの終わりを示す空の文字列が返されます。
複数の境界をプッシュすることが可能です。 最近プッシュされた境界に遭遇すると、EOFが返されます。 他の境界に遭遇すると、エラーが発生します。
- MultiFile.pop()
- セクション境界をポップします。 この境界はEOFとして解釈されなくなります。
- MultiFile.section_divider(str)
- 境界をセクションディバイダーラインに変えます。 デフォルトでは、このメソッドは
'--'
(MIMEセクションの境界にあります)の先頭に追加されますが、派生クラスでオーバーライドできるように宣言されています。 結果との比較では末尾の空白が無視されるため、このメソッドはLFまたはCR-LFを追加する必要はありません。
- MultiFile.end_marker(str)
- 境界文字列をエンドマーカー行に変換します。 デフォルトでは、このメソッドは
'--'
を付加し、'--'
を付加します(MIMEマルチパートメッセージ終了マーカーのように)が、派生クラスでオーバーライドできるように宣言されています。 結果との比較では末尾の空白が無視されるため、このメソッドはLFまたはCR-LFを追加する必要はありません。
最後に、 MultiFile インスタンスには2つのパブリックインスタンス変数があります。
- MultiFile.level
- 現在のパーツのネストの深さ。
- MultiFile.last
- 最後のファイルの終わりがメッセージの終わりマーカー用であった場合はTrue。
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()