85

したがって、ファイルを作成するには、次を使用します。

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

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

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

4

5 に答える 5

80

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

もう 1 つの優れた機能は、(メモリを使用する場合) 使用されているものに応じてio.BytesIOorを自動的に使用することです。これにより、Unicode 文字列またはバイナリ データ (バイト) を読み書きできます。io.StringIOmode

唯一の注意が必要なのは、ステップ間でファイルを閉じないようにする必要があるということです。そうすると、ファイルがメモリまたはディスクから削除されてしまうからです。seek(0)代わりに、ファイルメソッド呼び出しを使用して最初に巻き戻すことができます。

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

于 2013-08-31T17:06:10.630 に答える
56

StringIOモジュールにとBytesIOがありますio

StringIOは、テキスト モードで開かれたファイルのように動作しますio.open(filename, mode, encoding='...')。つまり、Unicode 文字列の読み取りと書き込み ( でファイルを開くのと同じです)。BytesIOmode='[rw]b'

パイソン 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

パイソン 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
于 2013-08-31T16:16:45.643 に答える
13

公式ドキュメントから、StringIOを仮想ファイルとして使用できます

from io import StringIO

output = 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()
于 2013-08-31T16:17:22.087 に答える
0

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

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")

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

于 2018-12-17T09:43:59.030 に答える
0

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

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

于 2013-08-31T16:17:32.020 に答える