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

Модуль ввода-вывода Python: Полный практический справочник

Привет всем! В сегодняшней статье мы рассмотрим использование модуля ввода-вывода Python.

Автор оригинала: Pankaj Kumar.

Привет всем! В сегодняшней статье мы рассмотрим использование модуля ввода-вывода Python.

Этот модуль весьма полезен, когда вы хотите выполнять операции ввода-вывода, связанные с файлами (например, чтение/запись файлов)

Хотя вы можете использовать обычные методы read() и write() для чтения/записи в файл, этот модуль дает нам гораздо большую гибкость в отношении этих операций.

Чтобы понять больше об этом модуле, давайте рассмотрим несколько примеров.

Модуль ввода-вывода Python

Этот модуль является частью стандартной библиотеки, поэтому нет необходимости устанавливать его отдельно с помощью pip .

Чтобы импортировать модуль ввода – вывода, мы можем сделать следующее:

import io

В модуле io есть 2 общих класса, которые очень полезны для нас:

  • BytesIO -> Операции ввода-вывода с байтовыми данными
  • StringIO -> Операции ввода-вывода со строковыми данными

Мы можем получить доступ к этим классам с помощью io.BytesIO и io.StringIO .

Давайте посмотрим на них один за другим.

Класс Python BytesIO

Здесь мы можем хранить наши данные в виде байтов ( b" ). Когда мы используем io.BytesIO , данные хранятся в буфере в памяти.

Мы можем получить экземпляр в поток байтов с помощью конструктора:

import io
bytes_stream = io.BytesIO(b'Hello from Journaldev\x0AHow are you?')

Обратите внимание, что мы передаем байтовую строку (с префиксом b ).

Прямо сейчас bytes_stream – это просто дескриптор потока байтов.

Чтобы на самом деле распечатать данные внутри буфера, нам нужно использовать bytes_stream.getvalue() .

import io
bytes_stream = io.BytesIO(b'Hello from Journaldev\x0AHow are you?')
print(bytes_stream.getvalue())

Здесь getvalue() принимает значение байтовой строки из дескриптора.

Поскольку байтовая строка \x0 является представлением ASCII новой строки (‘\n’), мы получаем следующий вывод:

Выход

b'Hello from Journaldev\nHow are you?'

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

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

Чтобы закрыть буфер, используйте:

bytes_stream.close()

Теперь давайте посмотрим на класс StringIO.

Класс Python StringIO

Аналогично io.BytesIO , класс io.StringIO может считывать данные, связанные со строками, из буфера StringIO.

import io

string_stream = io.StringIO("Hello from Journaldev\nHow are you?")

Мы можем читать из строкового буфера с помощью string_stream.read() и записывать с помощью string_stream.write() . Это очень похоже на чтение/запись из файла!

Мы можем распечатать содержимое с помощью getvalue() .

import io

string_stream = io.StringIO("Hello from Journaldev\nHow are you?")

# Print old content of buffer
print(f'Initially, buffer: {string_stream.getvalue()}')

# Write to the StringIO buffer
string_stream.write('This will overwrite the old content of the buffer if the length of this string exceeds the old content')

print(f'Finally, buffer: {string_stream.getvalue()}')

# Close the buffer
string_stream.close()

Выход

Initially, buffer: Hello from Journaldev
How are you?
Finally, buffer: This will overwrite the old content of the buffer if the length of this string exceeds the old content

Поскольку мы пишем в один и тот же буфер, новое содержимое, очевидно, перезапишет старое!

Чтение из буфера StringIO

Аналогично записи, мы также можем читать из буфера StringIO с помощью buffer.read() .

import io

input = io.StringIO('This goes into the read buffer.')
print(input.read())

Выход

This goes into the read buffer.

Как вы можете видеть, содержимое теперь находится внутри буфера чтения, который печатается с помощью buffer.read() .

Чтение файла с помощью ввода-вывода

Мы также можем использовать метод io.open() для прямого чтения из файла, аналогично чтению из объекта file.

Здесь этот модуль дает нам возможность буферизованного или небуферизованного чтения.

Например, следующее будет использовать буферизованное чтение для чтения файла, установив буферизацию . Если РАЗМЕР , это не будет означать буферизации!

Предположим sample.txt имеет следующее содержание:

Hello from JournalDev!
How are you?
This is the last line.
import io

# Read from a text file in binary format using io.open()
# We read / write using a buffer size of 5 bytes
file = io.open("sample.txt", "rb", buffering = 5)

print(file.read())

# Close the file
file.close()

Выход

b'Hello from JournalDev!\nHow are you?\nThis is the last line.\n'

Как вы можете видеть, файл был успешно прочитан! Здесь io прочитает файл, используя размер буфера примерно 5 байт.

Использование io.open() против os.open()

Функция io.open() является гораздо предпочтительным способом выполнения операций ввода-вывода, поскольку она выполнена в виде высокоуровневого питонического интерфейса.

Напротив, os.open() выполнит системный вызов функции open () . Это вернет файловый дескриптор, который нельзя использовать как объект io handle.

Поскольку io.open() является функцией-оболочкой для os.open() , обычно рекомендуется использовать такие функции-оболочки, поскольку они автоматически обрабатывают многие ошибки для вас.

Вывод

В этой статье мы узнали об использовании модуля ввода – вывода Python, и это два основных класса – io.BytesIO и io.StringIO для чтения и записи байтовых и строковых данных в буфер.

Рекомендации