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

89

Как мне создать файловый объект (того же типа утки, что и File) с содержимым строки?

Дэрил Спитцер
источник

Ответы:

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())
jfs
источник
1
@ABB принятый ответ уже показывает такое использование. Мой ответ дополняющий: он демонстрирует withметоды формулирования и записи, печати, поиска, чтения.
jfs
7

Это работает для Python2.7 и Python3.x:

io.StringIO(u'foo')
Геттли
источник
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')))
Lensonp
источник
2

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

e-satis
источник
«Страница не найдена» - rfk.id.au/software/projects/filelike/api/filelike.htm
jfs
2
Кажется, вернулся (7 лет спустя;)
Итан Фурман