Рубрики
Без рубрики

io – Инструменты ввода-вывода для текстовых, двоичных и необработанных потоков

Автор оригинала: 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 ÁÇÊ

Смотрите также