Ho un codice legacy con una funzione legacy che accetta un nome file come argomento e elabora il contenuto del file. Di seguito è riportato un facsimile di lavoro del codice.StringIO e compatibilità con l'istruzione 'with' (gestore contesto)
Quello che voglio fare non è scrivere sul disco con del contenuto che generi per utilizzare questa funzione legacy, quindi potrei usare StringIO
per creare un oggetto al posto del nome file fisico. Tuttavia, questo non funziona, come puoi vedere qui sotto.
Pensavo che il StringIO
fosse la strada da seguire. Qualcuno può dirmi se c'è un modo per usare questa funzione legacy e passarla qualcosa nell'argomento che non è un file su disco ma può essere trattato come tale dalla funzione legacy? La funzione legacy ha il gestore contesto with
che lavora sul valore del parametro filename
.
L'unica cosa che mi sono imbattuto in Google è stato: http://bugs.python.org/issue1286, ma questo non mi ha aiutato ...
Codice
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))
uscita
Questa è la uscita in FileOnDisk.txt
:
['This file is on disk.\n']
Questo è l'errore:
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 "Apri" un'istanza StringIO –