Как мне обернуть строку в файл в Python?


Ответы:


124

Для Python 2.x используйте модуль StringIO . Например:

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

Я использую cStringIO (который быстрее), но учтите, что он не принимает строки Unicode, которые нельзя закодировать как простые строки ASCII . (Вы можете переключиться на StringIO, изменив «from cStringIO» на «from StringIO».)

Для Python 3.x используйте ioмодуль.

f = io.StringIO('foo')

1
Теперь есть причина использовать cStringIO: cStringIO не поддерживает строки Unicode.
Армин Ронахер,

6
Я думаю, что лучше сделать «импортировать cStringIO как StringIO». Таким образом, если вам по какой-либо причине нужно переключиться на реализацию на чистом питоне, вам нужно будет изменить только одну строку ..
Джон Фухи,

Это работает и для Python2.7: io.StringIO(u'foo')я бы использовал это
guettli

29

В Python 3.0:

import io

with io.StringIO() as f:
    f.write('abcdef')
    print('gh', file=f)
    f.seek(0)
    print(f.read())

1
@ABB принятый ответ уже показывает такое использование. Мой ответ дополняющий: он демонстрирует withметоды формулирования и записи, печати, поиска, чтения.
jfs


5

Если ожидается, что ваш файлоподобный объект будет содержать байты, строка должна быть сначала закодирована как байты, а затем вместо этого может использоваться объект BytesIO . В 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')))

2

Два хороших ответа. Я бы добавил небольшую хитрость - если вам нужен реальный файловый объект (некоторые методы ожидают его, а не только интерфейс), вот способ создания адаптера:


«Страница не найдена» - rfk.id.au/software/projects/filelike/api/filelike.htm
jfs

2
Кажется, вернулся (7 лет спустя;)
Итан Фурман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.