StringIO и совместимость с оператором with (менеджер контекста)

У меня есть устаревший код с устаревшей функцией, которая принимает имя файла в качестве аргумента и обрабатывает содержимое файла. Рабочий факсимиле кода ниже.

Что я хочу сделать, так это не записывать на диск некоторый контент, который я генерирую, чтобы использовать эту устаревшую функцию, поэтому я мог бы использовать 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

44
задан Martijn Pieters 12 March 2019 в 14:45
поделиться