読者です 読者をやめる 読者になる 読者になる

[Python]ファイルオブジェクトが欲しいけど、ファイルの実体はいらない。

ファイル処理のテストする時に、

  1. テスト用のスタブファイルを大量に作りたくない。
    1. 実ファイルを作らずに、テストファイル内で完結したい。
  2. スタブファイルがあるのと同様に様々なファイル内容でテストしたい。

と考え、ファイルオブジェクトに取って代わるライブラリがあるか探した。

結論先に書くと

  • tempfile.TemporaryFileが使いやすい。
    • ファイルの実体つくる(ようだ?)けど、closeされたり、GCに捕まった時点で削除される。
  • read, writeだけならStringIOもあり。
    • Twitterでアオダグ先生が教えてくれました。ありがとうございます。感謝。

tempfile.TemporaryFileを使ってみる。

import tempfil
f = tempfile.TemporaryFile()

print(f)
>>> <open file '<fdopen>', mode 'w+b' at 0x352b10>

f.write('spam! spam!')
f.seek(0)

print(f.read())
>>> 'spam! spam!'

dir(f)
>>> ['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']

べんりー。べんりー。

参考(英語)

下記、Python2.7の本家ドキュメントの方が見栄えよいし、例が載ってたり便利。