Подтвердить что ты не робот

Что такое StringIO в python, который используется в действительности?

Я не профессионал, и я почесываю голову, понимая, для чего именно используется StringIO. На некоторых примерах я просматривал интернет. Однако почти все примеры очень абстрактны. И они просто показывают "как" использовать его. Но никто из них не показывает "почему" и "в каких обстоятельствах" он должен/должен его использовать? Спасибо заранее

P.s. не путайте с этим вопросом в stackoverflow: StringIO Usage, который сравнивает строку и StringIo.

4b9b3361

Ответ 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...')