ファイル名を引数として取り、ファイルの内容を処理するレガシー関数を備えたレガシーコードがいくつかあります。コードの実用的な複製は以下のとおりです。
私がやりたいのは、このレガシー関数を使用するために生成したコンテンツをディスクに書き込む必要がないためStringIO
、物理ファイル名の代わりにオブジェクトを作成するために使用できます。ただし、以下に示すように、これは機能しません。
StringIO
私はこれで行く方法だと思いました。このレガシー関数を使用して、ディスク上のファイルではないが、レガシー関数によってそのように扱うことができる何かを引数に渡す方法があるかどうか誰かに教えてもらえますか?レガシー関数には、パラメーター値with
の処理を行うコンテキストマネージャーがあります。filename
私がグーグルで出くわした1つのことは: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