Como faço para embrulhar uma string em um arquivo em Python?

89

Como faço para criar um objeto semelhante a um arquivo (mesmo tipo de pato que Arquivo) com o conteúdo de uma string?

Daryl Spitzer
fonte

Respostas:

124

Para Python 2.x, use o módulo StringIO . Por exemplo:

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

Eu uso cStringIO (que é mais rápido), mas observe que ele não aceita strings Unicode que não podem ser codificadas como strings ASCII simples . (Você pode mudar para StringIO mudando "de cStringIO" para "de StringIO".)

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

f = io.StringIO('foo')
Daryl Spitzer
fonte
1
Agora há uma razão para usar cStringIO: cStringIO não oferece suporte a strings Unicode.
Armin Ronacher
6
Acho que uma ideia melhor é fazer 'import cStringIO as StringIO'. Dessa forma, se você precisar mudar para a implementação pura de python por qualquer motivo, você só precisará alterar uma linha.
John Fouhy
Isso funciona para Python2.7 também: io.StringIO(u'foo')Eu usaria isso
guettli
29

Em Python 3.0:

import io

with io.StringIO() as f:
    f.write('abcdef')
    print('gh', file=f)
    f.seek(0)
    print(f.read())
jfs
fonte
1
@ABB a resposta aceita já mostra tal uso. Minha resposta é complementar: demonstra os withmétodos de declaração e escrita, impressão, busca e leitura.
jfs
7

Isso funciona para Python2.7 e Python3.x:

io.StringIO(u'foo')
Guettli
fonte
5

Se se espera que seu objeto semelhante a um arquivo contenha bytes, a string deve primeiro ser codificada como bytes e, em seguida, um objeto BytesIO pode ser usado em seu lugar. Em 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
fonte