ファイル名を引数とし、ファイルの内容を処理する従来の関数を持つレガシーコードがあります。コードの作業ファクシミリは以下の通りです。StringIOと 'with'ステートメント(コンテキストマネージャ)との互換性
このレガシー機能を使用するために生成するコンテンツをディスクに書き込む必要はありません。したがって、物理ファイル名の代わりにStringIO
を使用してオブジェクトを作成することはできます。しかし、これは以下のように動作しません。
私はStringIO
と思っていました。誰も私にこのレガシー関数を使用し、ディスク上のファイルではないが、レガシー関数で扱うことができる引数に何かを渡す方法があるかどうか教えていただけますか?従来の関数では、パラメータ値に対して作業を行うwith
コンテキストマネージャがあります。
私がいたグーグルで出会った一つのこと:http://bugs.python.org/issue1286、それが私を助けにはならなかった...
コード
from pprint import pprint
import StringIO
# Legacy Function
def processFile(filename):
with open(filename, 'r') as fh:
return fh.readlines()
# This works
print 'This is the output of FileOnDisk.txt'
pprint(processFile('c:/temp/FileOnDisk.txt'))
print
# This fails
plink_data = StringIO.StringIO('StringIO data.')
print 'This is the error.'
pprint(processFile(plink_data))
出力
これは、 FileOnDisk.txt
の出力:
['This file is on disk.\n']
これはエラーです:
Traceback (most recent call last):
File "C:\temp\test.py", line 20, in <module>
pprint(processFile(plink_data))
File "C:\temp\test.py", line 6, in processFile
with open(filename, 'r') as fh:
TypeError: coercing to Unicode: need string or buffer, instance found
あなたが「オープン」、それは内部でなければならないので、問題が解決しない残念なことにたStringIOインスタンス –