Jak zawinąć ciąg w pliku w Pythonie?

85

Jak utworzyć obiekt podobny do pliku (ten sam typ kaczki co plik) z zawartością ciągu?

Daryl Spitzer
źródło

Odpowiedzi:

121

W przypadku języka Python 2.x użyj modułu StringIO . Na przykład:

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

Używam cStringIO (który jest szybszy), ale zauważ, że nie akceptuje on ciągów Unicode, których nie można zakodować jako zwykłych ciągów ASCII . (Możesz przełączyć się na StringIO, zmieniając „z cStringIO” na „z StringIO”).

W przypadku języka Python 3.x użyj iomodułu.

f = io.StringIO('foo')
Daryl Spitzer
źródło
1
Jest teraz powód, aby używać cStringIO: cStringIO nie obsługuje łańcuchów Unicode.
Armin Ronacher
6
Myślę, że lepszym pomysłem jest wykonanie „importu cStringIO jako StringIO”. W ten sposób, jeśli z jakiegoś powodu musisz przełączyć się na implementację czystego Pythona, wystarczy zmienić tylko jedną linię.
John Fouhy
Działa to również dla io.StringIO(u'foo')
Pythona 2.7: użyłbym
29

W Pythonie 3.0:

import io

with io.StringIO() as f:
    f.write('abcdef')
    print('gh', file=f)
    f.seek(0)
    print(f.read())
jfs
źródło
1
@ABB zaakceptowana odpowiedź pokazuje już takie użycie. Moja odpowiedź jest komplementarna: demonstruje - withwypowiadanie i pisanie, drukowanie, wyszukiwanie, czytanie.
jfs
6

Działa to dla Python2.7 i Python3.x:

io.StringIO(u'foo')
guettli
źródło
5

Jeśli obiekt plikopodobny ma zawierać bajty, ciąg powinien być najpierw zakodowany jako bajty, a następnie można użyć obiektu BytesIO . W Pythonie 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
źródło