¿Cómo envuelvo una cadena en un archivo en Python?

85

¿Cómo creo un objeto similar a un archivo (el mismo tipo de pato que File) con el contenido de una cadena?

Daryl Spitzer
fuente

Respuestas:

121

Para Python 2.x, use el módulo StringIO . Por ejemplo:

>>> from cStringIO import StringIO
>>> f = StringIO('foo')
>>> f.read()
'foo'

Utilizo cStringIO (que es más rápido), pero tenga en cuenta que no acepta cadenas Unicode que no se pueden codificar como cadenas ASCII simples . (Puede cambiar a StringIO cambiando "de cStringIO" a "de StringIO").

Para Python 3.x, use el iomódulo.

f = io.StringIO('foo')
Daryl Spitzer
fuente
1
Ahora hay una razón para usar cStringIO: cStringIO no admite cadenas Unicode.
Armin Ronacher
6
Creo que una mejor idea es hacer 'importar cStringIO como StringIO'. De esa manera, si necesita cambiar a la implementación de Python puro por cualquier motivo, solo necesita cambiar una línea ..
John Fouhy
Esto también funciona para Python2.7: io.StringIO(u'foo')usaría esto
guettli
29

En Python 3.0:

import io

with io.StringIO() as f:
    f.write('abcdef')
    print('gh', file=f)
    f.seek(0)
    print(f.read())
jfs
fuente
1
@ABB, la respuesta aceptada ya muestra dicho uso. Mi respuesta es complementaria: demuestra los withmétodos de enunciado y escritura, impresión, búsqueda, lectura.
jfs
6

Esto funciona para Python2.7 y Python3.x:

io.StringIO(u'foo')
guettli
fuente
5

Si se espera que su objeto similar a un archivo contenga bytes, la cadena debe codificarse primero como bytes y luego se puede usar un objeto BytesIO en su lugar. En Python 3:

from io import BytesIO

string_repr_of_file = 'header\n byline\n body\n body\n end'
function_that_expects_bytes(BytesIO(bytes(string_repr_of_file,encoding='utf-8')))
lensonp
fuente