У меня есть устаревший код с устаревшей функцией, которая принимает имя файла в качестве аргумента и обрабатывает содержимое файла. Рабочий факсимиле кода ниже.
Что я хочу сделать, так это не записывать на диск некоторый контент, который я генерирую, чтобы использовать эту устаревшую функцию, поэтому я мог бы использовать StringIO
для создания объекта вместо физического имени файла. Однако это не работает, как вы можете видеть ниже.
Я подумал, что StringIO
— это то, что нужно. Может ли кто-нибудь сказать мне, есть ли способ использовать эту устаревшую функцию и передать ей в аргументе что-то, что не является файлом на диске, но может рассматриваться как таковое устаревшей функцией? В устаревшей функции диспетчер контекста with
работает со значением параметра filename
.
Единственное, что я наткнулся в гугле, это: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
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