Як обернути рядок у файл у Python?


Відповіді:


121

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

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

Я використовую cStringIO (що швидше), але зверніть увагу, що він не приймає рядки Unicode, які не можуть кодуватися як звичайні рядки ASCII . (Ви можете переключитися на StringIO, змінивши "з cStringIO" на "з StringIO".)

Для Python 3.x використовуйте ioмодуль.

f = io.StringIO('foo')

1
Зараз є причина використовувати cStringIO: cStringIO не підтримує рядки Unicode.
Армін Ронахер

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

Це працює і для 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.