Сообщить об ошибке.

Функция readinto() модуля os в Python

Чтение из файлового дескриптора напрямую в буфер

Синтаксис:

import os

# Добавлено в Python 3.14
os.readinto(fd, buffer, /)

Параметры:

  • fd - файловый дескриптор (целое число), полученный через os.open() или os.pipe()
  • buffer - изменяемый (mutable) буферный объект, поддерживающий интерфейс bytes-like (например, bytearray или memoryview)

Возвращаемое значение:

  • Количество прочитанных байт (целое число ≥ 0)
  • 0 означает:
    • Конец файла (EOF)
    • Или нулевую длину буфера
  • Никогда не возвращает отрицательные значения

Описание os.readinto():

Функция os.readinto() модуля os выполняет низкоуровневое чтение из файлового дескриптора напрямую в предоставленный буфер.

Ключевые особенности:

  • Оптимизирована для работы с сырыми файловыми дескрипторами
  • Автоматически повторяет системный вызов при прерывании сигналом
  • Чтение происходит непосредственно в переданный буфер, минуя создание промежуточных объектов
  • Всегда возвращает фактическое количество прочитанных байт

Важные нюансы:

  1. Размер чтения:

    • Может прочитать меньше данных, чем размер буфера
    • 0 байт означает конец файла (если буфер не нулевой длины)
  2. Поведение при ошибках:

    try:
        bytes_read = os.readinto(fd, buf)
    except OSError as e:
        print(f"Ошибка чтения: {e}")
    
  3. Отличие от высокоуровневых аналогов:

    # Для файловых объектов используйте:
    with open('file.txt', 'rb') as f:
        f.readinto(buffer)  # Вместо os.readinto()
    

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

  1. Используйте только с "сырыми" файловыми дескрипторами
  2. Для обычных файлов предпочтительнее высокоуровневые методы
  3. Всегда проверяйте количество прочитанных байт
  4. Закрывайте дескрипторы через os.close()

Добавлено в Python 3.14

Примеры использования os.readinto():

Базовое чтение файла:

import os

# Открываем файл и получаем дескриптор
fd = os.open('data.bin', os.O_RDONLY)
buf = bytearray(1024)  # Буфер на 1КБ

bytes_read = os.readinto(fd, buf)
print(f"Прочитано {bytes_read} байт")
os.close(fd)

Чтение из pipe:

r_fd, w_fd = os.pipe()
os.write(w_fd, b'test data')
buf = bytearray(10)

bytes_read = os.readinto(r_fd, buf)
print(buf[:bytes_read])  # b'test data'
os.close(r_fd)
os.close(w_fd)

Контрольное чтение (проверка EOF):

fd = os.open('empty.txt', os.O_RDONLY)
buf = bytearray(10)

if os.readinto(fd, buf) == 0:
    print("Файл пуст или достигнут конец")
os.close(fd)

Сравнение подходов

МетодИспользованиеПреимущества
os.readinto()Низкоуровневые операции с дескрипторамиМинимум аллокаций памяти
io.readinto()Работа с файловыми объектамиБуферизация, кодировки