3

私はファイルオブジェクトを期待する関数を持っています、単純化された例:

def process(fd):
    print fd.read()

これは通常、次のように呼び出されます。

fd = open('myfile', mode='r')
process(fd)

この関数を変更することはできません。ファイルの内容は既にメモリ内にあります。convertファイルの内容をディスクに書き込まずにファイルオブジェクトに入れる方法はありますか?次のようなことができます:

contents = 'The quick brown file'
fd = convert(contents) # ??
process(fd)
4

2 に答える 2

1

上記の答えは、「ファイルのようなオブジェクト」に満足している場合に機能します。そのStringIOクラスのオブジェクトは特別なケースにすぎません。ただし、StringIOクラスのインスタンスは、Python で使用される厳密な意味での「ファイル オブジェクト」ではありませんopen(つまり、組み込み関数によって返されるものと同じ型)。

たとえば、StringIOオブジェクトにはメソッドがなくfileno、意図的にメソッドが省略されています。

fileno() は実装されていないため、それを使用するコードは早期に例外をトリガーします。

「ファイルのようなオブジェクト」だけでなく、厳密な「ファイル オブジェクト」である理由はいくつかあります。上記のように、

多くの場合、実際のファイルを使用する方が高速です (ただし、不便です)。

もう 1 つの理由は、「ファイルのような」オブジェクト (StringIOクラスのオブジェクトなど) を of の引数の引数として使用できないことですこれは、Google でこの質問を見つけたときに念頭に置いていた使用例です。これは、Python 3.7 の(defining the module, which uses) の 1324 行目で、メソッドが variable を定義しようとするためです。これは明らかに、最初にメソッドがある場合にのみ機能します。したがって、真の「ファイル オブジェクト」と「ファイルのようなオブジェクト」(クラスのインスタンスなど) の区別は、無意味な衒学ではありません。stdincreate_subprocess_execasyncio.subprocesssubprocess.pysubprocessasyncio.subprocess_get_handlesp2cread = stdin.fileno()stdinfilenoStringIO

以下は理想的な解決策を意図したものではありませんが、私の目的には役立ちました。

def string_to_file(string):
    file_object = open('temporary_file.temporary', 'w')
    file_object.write(string)
    file_object.flush()
    return file_object

一方、ディスクに書き込むため、目的には適していません。これは代わりに機能する可能性があります:

def string_to_file(string):
    import tempfile
    file_like_object = tempfile.NamedTemporaryFile()
    file_like_object.write(string.encode())
    file_like_object.flush()
    return file_like_object

どちらも に渡すために機能しcreate_subprocess_execます。

于 2018-07-26T19:55:56.150 に答える