web-dev-qa-db-ja.com

仮想ファイル処理の方法は?

そのため、ファイルを作成するために次を使用します。

fileHandle = open('fileName', 'w')

次に、ファイルに内容を書き込み、ファイルを閉じます。次のステップでは、ファイルを処理します。プログラムの最後に、削除する必要がある「物理ファイル」が作成されます。

「物理」ファイルとまったく同じように動作する(同じ方法で操作できる)が、Pythonの実行の最後には存在しない「仮想」ファイルを作成する方法はありますか?

53
Steve Grafton

_tempfile.SpooledTemporaryFile_ の使用を検討することをお勧めします。これは、最初に一時的なメモリベースの仮想ファイルを作成するが、自動的に物理ディスクに切り替えるという意味で、両方の長所を提供しますメモリに保持されているデータが指定されたサイズを超える場合は、ベースのファイル。

もう1つの素晴らしい機能は、(メモリを使用する場合)modeとは何かに応じて _io.BytesIO_ または _io.StringIO_ を自動的に使用することです。使用されている-Unicode文字列またはバイナリデータ(バイト)を読み書きできます。

唯一のトリッキーな部分は、ステップ間でファイルを閉じることを避ける必要があるという事実かもしれません。そうすると、ファイルがメモリまたはディスクから削除されるためです。代わりに、ファイル seek(0) メソッド呼び出しで、最初に巻き戻すことができます。

ファイルの処理が完了して閉じると、ファイル内のデータ量が原因で物理ファイルにロールオーバーされた場合、ファイルはディスクから自動的に削除されます。

57
martineau

StringIOモジュールにはBytesIOioがあります。

StringIOはテキストモードで開かれたファイルのように動作します-ユニコード文字列の読み取りと書き込み(io.open(filename, mode, encoding='...')でファイルを開くことに相当)、およびBytesIOはで開かれたファイルのように動作しますバイナリモード(mode='[rw]b')、および書き込みバイトを読み取ることができます。

Python 2:

In [4]: f = io.BytesIO('test')
In [5]: type(f.read())
Out[5]: str
In [6]: f = io.StringIO(u'test')
In [7]: type(f.read())
Out[7]: unicode

Python 3:

In [2]: f = io.BytesIO(b'test')
In [3]: type(f.read())
Out[3]: builtins.bytes
In [4]: f = io.StringIO('test')
In [5]: type(f.read())
Out[5]: builtins.str
47
Viktor Kerkez

公式の documentation からStringIOを仮想ファイルとして使用できます

import StringIO

output = StringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'

# Retrieve file contents -- this will be
# 'First line.\nSecond line.\n'
contents = output.getvalue()

# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()

ファイルではなくメモリに書き込む場合は、テキストをバッファに書き込むだけで、次の関数を使用できます。

def write(text):
  global buffer
  buffer += text + '\n'  # Add a linefeed as you would if you were writing to a file

buffer = ""  # Initialize the buffer
write("My name is Steve Grafton")

最後に、ファイルにファイルを書き込んでからファイルを開いてその内容をすべてバッファーに読み込む場合と同じバッファーができます!さらに、プロセス中に(書き込みを完了する前に)バッファーを使用して、読み取りと書き込みの両方のファイルを作成したかのように検索することができます。この場合のみ、ポインターが

0
Apostolos

StringIOモジュールがあり、 そのドキュメント を読んでください。使いやすいはずです。

ただし、これにより「ファイル」の内容がメモリに保持されることに注意してください。データが多すぎる場合は、おそらく実際のファイルを作成することをお勧めします。/tmpで、後で削除します。

0
nickie