Что такое StringIO в python, который используется в действительности?
Я не профессионал, и я почесываю голову, понимая, для чего именно используется StringIO. На некоторых примерах я просматривал интернет. Однако почти все примеры очень абстрактны. И они просто показывают "как" использовать его. Но никто из них не показывает "почему" и "в каких обстоятельствах" он должен/должен его использовать?
Спасибо заранее
P.s. не путайте с этим вопросом в stackoverflow: StringIO Usage, который сравнивает строку и StringIo.
Ответы
Ответ 1
Он используется, когда у вас есть API, который принимает только файлы, но вам нужно использовать строку. Например, чтобы сжать строку, используя модуль gzip в Python 2:
import gzip
import StringIO
stringio = StringIO.StringIO()
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w')
gzip_file.write('Hello World')
gzip_file.close()
stringio.getvalue()
Ответ 2
StringIO предоставляет вам файловый доступ к строкам, поэтому вы можете использовать существующий модуль, который имеет дело с файлом, и практически ничего не менять и заставить его работать со строками.
Например, скажем, у вас есть регистратор, который пишет вещи в файл, и вы хотите вместо этого отправлять выходные данные журнала по сети. Вы можете прочитать файл и записать его содержимое в сеть, или вы можете записать журнал в объект StringIO и отправить его в сеть, не касаясь файловой системы. StringIO упрощает это с первого взгляда, затем переключается на второй способ.
Ответ 3
В тех случаях, когда вы хотите, чтобы файл-подобный объект ACTS, как файл, но записывал в буфере строк в памяти: StringIO является инструментом. Если вы создаете большие строки, такие как текстовые документы, и выполняете много конкатенации строк, вам может быть проще просто использовать StringIO вместо нескольких типов операций mystr += 'more stuff\n'
.
Ответ 4
Несколько вещей, которые я лично использовал для:
-
Цельное кэширование файлов. У меня есть script, который читает PDF файлы и делает валидацию различных вещей о них. Библиотека PDF, которую я использую, принимает открытый файл в своем конструкторе документа. Первоначально я только что открыл PDF файл, который мне интересен при чтении, однако, когда я изменил его, чтобы сразу прочитать весь файл в памяти, а затем передать объект StringIO в библиотеку PDF, время работы моего script сократилось наполовину.
-
Отсроченная печать. Тот же script печатает заголовок перед каждым прочитанным PDF файлом. Однако я могу указать в командной строке, следует ли игнорировать определенные тесты, которые находятся в его файле конфигурации, или включать только определенные. Если я проигнорирую все тесты для данного PDF-документа, я не хочу, чтобы заголовок печатался, но я не буду знать, сколько тестов я выполнял, пока не закончил выполнение тестов (тесты также могут быть определены динамически). Поэтому я захватываю заголовок в объект StringIO, изменяя sys.stdout
, чтобы указать на него, и каждый раз, когда я запускаю тест, я проверяю, есть ли у этого объекта что-то в нем. Если это так, я печатаю его, а reset - пустым. Voila, только PDF файлы, у которых есть тесты, печатаются заголовки.
Ответ 5
Я просто использовал StringIO на практике для двух вещей:
- Для модульного тестирования script, который выполняет много
print
ing, путем перенаправления sys.stdout
на экземпляр StringIO
для легкого анализа;
- Чтобы создать гарантированный хорошо сформированный XML-документ (пользовательский запрос API) с помощью
ElementTree
, а затем write
для отправки по HTTP-соединению.
Не то, что вам нужно StringIO
часто, но иногда это довольно полезно.
Ответ 6
Django имеет функцию call_command
, которая используется для вызова команд управления. Эта функция выводит вывод на stdout и не возвращает никакого значения. Если вы хотите знать, успешно ли выполнялась команда или нет, вам нужно посмотреть результат и решить.
Используя StringIO, вы можете захватывать вывод и проверять, является ли он желаемым выходом или нет.
with io.StringIO() as output:
call_command('custom_command', stdout=output)
if 'Success' not in output.getvalue():
print('Custom command failed...')