Для чего на самом деле используется StringIO в python?



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



p. s. Не следует путать с этим вопросом на stackoverflow: StringIO использование, которое сравнивает строку и StringIo.

701   7  

7 ответов:

Он используется, когда у вас есть какой-то 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()

StringIO дает вам файловый доступ к строкам, поэтому вы можете использовать существующий модуль, который имеет дело с файлом и почти ничего не меняет и заставляет его работать со строками.

например, скажем, у вас есть регистратор, который записывает все в файл и вы хотите вместо отправки сообщений по сети. Вы можете прочитать файл и записать его содержимое в сеть, или вы можете записать журнал в объект StringIO и отправить его в свое сетевое назначение, не касаясь файловой системы. StringIO позволяет легко сделать это первым способом, а затем переключиться на второй способ.

в тех случаях, когда вы хотите файлоподобный объект, который действует как файл, но записывает в буфер строк в памяти: StringIO-это инструмент. Если вы создаете большие строки, такие как текстовые документы, и делаете много конкатенаций строк, вам может быть проще просто использовать StringIO вместо группы mystr += 'more stuff\n' тип операций.

пару вещей, которые я лично использовал для:

  1. кэширование всего файла. У меня есть скрипт, который читает PDF-файлы и делает проверку различных вещей о них. Библиотека PDF, которую я использую, принимает открытый файл в своем конструкторе документов. Первоначально я просто открыл PDF, который мне было интересно читать, однако когда я изменил его, чтобы прочитать весь файл сразу в память, а затем передать объект StringIO в библиотеку PDF, время работы моего скрипта было сокращено половина.

  2. отложенной печатью. Тот же скрипт печатает заголовок перед каждым PDF-файлом, который он читает. Однако я могу указать в командной строке, следует ли игнорировать определенные тесты, которые находятся в его файле конфигурации, или включать только определенные. Если я проигнорирую все тесты для данного PDF я не хочу, чтобы заголовок был напечатан, но я не буду знать, сколько тестов я выполнил, пока не закончу выполнение тестов (тесты также могут быть определены динамически). Так что я захватить заголовок в StringIO объекта, изменяя sys.stdout чтобы указать на него, и каждый раз, когда я запускаю тест, я проверяю, есть ли в этом объекте что-нибудь. Если это так, я печатаю его и сбрасываю его на пустой. Вуаля, только PDF-файлы, которые имеют тесты, имеют напечатанные заголовки.

Я только что использовал StringIO на практике для двух вещей:

  • для модульного тестирования скрипта, который делает много printing, путем перенаправления sys.stdout до StringIO экземпляр для легкого анализа;
  • чтобы создать гарантированный хорошо сформированный XML-документ (пользовательский запрос API) с помощью ElementTree а то write для отправки через HTTP-соединение.

не нужно StringIOчасто, но иногда это очень полезно.

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...')

я использовал его вместо текстовых файлов для модульного тестирования.

например, чтобы сделать csv-файл для тестирования с пандами (Python 3):

import io
f = io.StringIO("id,name\n1,brian\n2,amanda\n3,zoey\n")
df = pd.read_csv(f) # pandas takes a file path or a file-like object

из документации здесь:

поток в памяти для ввода-вывода текста. текстовый буфер отбрасывается при вызове метода close ().

начальное значение буфера может быть установлено путем предоставления initial_value.

метод getvalue (): возвращает str содержит все содержимое буфера.

Comments

    Ничего не найдено.