Mam starszą wersję kodu ze starszą funkcją, która pobiera nazwę pliku jako argument i przetwarza zawartość pliku. Działająca faksymile kodu znajduje się poniżej.StringIO i kompatybilność z instrukcją 'with' (menedżer kontekstu)
Co chcę zrobić, to nie trzeba pisać na dysk z pewną treścią, którą generuję, aby użyć tej starszej funkcji, więc mógłbym użyć StringIO
do stworzenia obiektu zamiast fizycznej nazwy pliku. Jednak to nie działa, jak widać poniżej.
Pomyślałem, że StringIO
było drogą do tego. Czy ktoś może mi powiedzieć, czy istnieje sposób korzystania z tej funkcji legacy i przekazać go w argumencie, który nie jest plikiem na dysku, ale może być traktowany jako taki przez funkcję legacy? Funkcja starsza ma menedżera kontekstu with
, który wykonuje pracę nad wartością parametru filename
.
Jedyną rzeczą natknąłem w google było: http://bugs.python.org/issue1286, ale mi to nie pomoże ...
Kod
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))
Wyjście
To wyjście w FileOnDisk.txt
:
['This file is on disk.\n']
Jest to błąd:
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
cant „Otwórz” instancję StringIO –