> **Источник:** https://python-all.ru/2.7/library/stringio.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 7.5. [`StringIO`](https://python-all.ru/2.7/library/stringio.html#module-StringIO) – Чтение и запись строк как файлов

Этот модуль реализует файлоподобный класс [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO), который читает и записывает строковый буфер (также известный как *файлы в памяти*). Описание операций с файловыми объектами см. в разделе [Файловые объекты](https://python-all.ru/2.7/library/stdtypes.html#bltin-file-objects)). (Для стандартных строк см. [`str`](https://python-all.ru/2.7/library/functions.html#str) и [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode).)

#### `class StringIO.StringIO([buffer])`

Когда создаётся объект [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO), его можно инициализировать существующей строкой, передав строку в конструктор. Если строка не задана, [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO) будет пустым. В обоих случаях начальная позиция файла равна нулю.

Объект [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO) может принимать как строки Unicode, так и 8-битные строки, но смешивать их нужно с осторожностью. Если используются и те, и другие, 8-битные строки, которые не могут быть интерпретированы как 7-битный ASCII (т.е. используют 8-й бит), при вызове [`getvalue()`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO.getvalue) вызовут исключение [`UnicodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeError).

Следующие методы объектов [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO) требуют особого упоминания:

#### `StringIO.getvalue()`

Извлекает всё содержимое «файла» в любое время до вызова метода [`close()`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO.close) объекта [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO). См. примечание выше о смешивании строк Unicode и 8-битных строк; такое смешивание может привести к тому, что этот метод вызовет [`UnicodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeError).

#### `StringIO.close()`

Освобождает буфер памяти. Попытка выполнения дальнейших операций с закрытым объектом [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO) вызовет исключение [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError).

Пример использования:

```python
import StringIO

output = StringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'

# Извлечь содержимое файла – это будет
# 'Первая строка.
Вторая строка.
'
contents = output.getvalue()

# Закрыть объект и освободить буфер памяти –
# .getvalue() теперь будет вызывать исключение.
output.close()
```

# 7.6. [`cStringIO`](https://python-all.ru/2.7/library/stringio.html#module-cStringIO) – Более быстрая версия [`StringIO`](https://python-all.ru/2.7/library/stringio.html#module-StringIO)

Модуль [`cStringIO`](https://python-all.ru/2.7/library/stringio.html#module-cStringIO) предоставляет интерфейс, аналогичный модулю [`StringIO`](https://python-all.ru/2.7/library/stringio.html#module-StringIO). Интенсивное использование объектов [`StringIO.StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO) можно сделать более эффективным, используя вместо них функцию [`StringIO()`](https://python-all.ru/2.7/library/stringio.html#module-StringIO) из этого модуля.

#### `cStringIO.StringIO([s])`

Возвращает поток, подобный StringIO, для чтения или записи.

Поскольку это фабричная функция, возвращающая объекты встроенных типов, нельзя создать собственную версию с помощью наследования. Невозможно задать атрибуты для неё. В таких случаях используйте исходный модуль [`StringIO`](https://python-all.ru/2.7/library/stringio.html#module-StringIO).

В отличие от модуля [`StringIO`](https://python-all.ru/2.7/library/stringio.html#module-StringIO), этот модуль не может принимать строки Unicode, которые не могут быть закодированы как простые строки ASCII.

Ещё одно отличие от модуля [`StringIO`](https://python-all.ru/2.7/library/stringio.html#module-StringIO) заключается в том, что вызов [`StringIO()`](https://python-all.ru/2.7/library/stringio.html#module-StringIO) с параметром-строкой создаёт объект только для чтения. В отличие от объекта, созданного без строкового параметра, у него нет методов записи. Такие объекты обычно не видны. Они появляются в трассировках как `StringI` и `StringO`.

Также предоставляются следующие объекты данных:

#### `cStringIO.InputType`

Объект типа объектов, созданных вызовом [`StringIO()`](https://python-all.ru/2.7/library/stringio.html#module-StringIO) с параметром-строкой.

#### `cStringIO.OutputType`

Объект типа объектов, возвращаемых вызовом [`StringIO()`](https://python-all.ru/2.7/library/stringio.html#module-StringIO) без параметров.

Также существует C API для модуля; за дополнительной информацией обращайтесь к исходному коду модуля.

Пример использования:

```python
import cStringIO

output = cStringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'

# Извлечь содержимое файла – это будет
# 'Первая строка.
Вторая строка.
'
contents = output.getvalue()

# Закрыть объект и освободить буфер памяти –
# .getvalue() теперь будет вызывать исключение.
output.close()
```
