Автор оригинала: 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
для чтения и записи байтовых и строковых данных в буфер.
Рекомендации
- Документация на Python о модуле ввода-вывода
- Статья JournalDev о модуле ввода-вывода Python