Автор оригинала: Doug Hellmann.
Цель:
Реализует файловый ввод-вывод и предоставляет классы для работы с буферы с использованием файлового API.
Модуль io
реализует классы, стоящие за встроенным интерпретатором open ()
для операций ввода и вывода на основе файлов. Классы декомпозированы таким образом, чтобы их можно было перекомбинировать для других целей, например, чтобы разрешить запись данных Unicode в сетевой сокет.
Потоки в памяти
StringIO
предоставляет удобные средства работы с текстом в памяти с помощью файлового API ( read ()
, write ()
и т. д.). Использование StringIO
для построения больших строк в некоторых случаях может обеспечить экономию производительности по сравнению с некоторыми другими методами конкатенации строк. Буферы потока в памяти также полезны для тестирования, когда запись в реальный файл на диске может замедлить выполнение набора тестов.
Вот несколько стандартных примеров использования буферов StringIO
:
io_stringio.py
import io # Writing to a buffer output io.StringIO() output.write('This goes into the buffer. ') print('And so does this.', fileoutput) # Retrieve the value written print(output.getvalue()) output.close() # discard buffer memory # Initialize a read buffer input io.StringIO('Inital value for read buffer') # Read from the buffer print(input.read())
В этом примере используется read ()
, но также доступны методы readline ()
и readlines ()
. Класс StringIO
также предоставляет метод seek ()
для перемещения в буфере во время чтения, который может быть полезен для перемотки назад, если используется алгоритм упреждающего анализа.
$ python3 io_stringio.py This goes into the buffer. And so does this. Inital value for read buffer
Для работы с необработанными байтами вместо текста Unicode используйте BytesIO
.
io_bytesio.py
import io # Writing to a buffer output io.BytesIO() output.write('This goes into the buffer. '.encode('utf-8')) output.write('ÁÇÊ'.encode('utf-8')) # Retrieve the value written print(output.getvalue()) output.close() # discard buffer memory # Initialize a read buffer input io.BytesIO(b'Inital value for read buffer') # Read from the buffer print(input.read())
Значения, записываемые в BytesIO
, должны быть байтами
, а не str
.
$ python3 io_bytesio.py b'This goes into the buffer. \xc3\x81\xc3\x87\xc3\x8a' b'Inital value for read buffer'
Упаковка байтовых потоков для текстовых данных
Необработанные байтовые потоки, такие как сокеты, могут быть обернуты слоем для обработки кодирования и декодирования строк, что упрощает их использование с текстовыми данными. Класс TextIOWrapper
поддерживает как запись, так и чтение. Аргумент write_through
отключает буферизацию и немедленно сбрасывает все данные, записанные в оболочку, в базовый буфер.
io_textiowrapper.py
import io # Writing to a buffer output io.BytesIO() wrapper io.TextIOWrapper( output, encoding'utf-8', write_throughTrue, ) wrapper.write('This goes into the buffer. ') wrapper.write('ÁÇÊ') # Retrieve the value written print(output.getvalue()) output.close() # discard buffer memory # Initialize a read buffer input io.BytesIO( b'Inital value for read buffer with unicode characters ' + 'ÁÇÊ'.encode('utf-8') ) wrapper io.TextIOWrapper(input, encoding'utf-8') # Read from the buffer print(wrapper.read())
В этом примере в качестве потока используется экземпляр BytesIO
. Примеры для bz2, http.server и subprocess демонстрируют использование TextIOWrapper
с другими типами файловых объектов.
$ python3 io_textiowrapper.py b'This goes into the buffer. \xc3\x81\xc3\x87\xc3\x8a' Inital value for read buffer with unicode characters ÁÇÊ
Смотрите также
- стандартная библиотека документации для io
- Пример HTTP POST – использует
detach ()
изTextIOWrapper
для управления оболочкой отдельно от обернутого сокета. - Эффективное объединение строк в Python – исследует различные методы объединения строк и их относительные достоинства.