os.pread(), pwrite(), readv(), writev(), preadv(), pwritev(), readinto() în Python

Descriptori de fișiere (os) Python 3.3+ (preadv/pwritev: 3.7+, readinto: 3.14+)

Citire și scriere la o poziție dată sau în mai multe buffere deodată, fără a muta cursorul fișierului.

Sintaxă
os.pread(fd, n, pozitie) / os.pwrite(fd, date, pozitie)
os.readv(fd, buffere) / os.writev(fd, buffere)
os.preadv(fd, buffere, pozitie) / os.pwritev(fd, buffere, pozitie)
os.readinto(fd, buffer)

Ce face os.pread(), pwrite(), readv(), writev(), preadv(), pwritev(), readinto()

pread(fd, n, poz) citește n octeți începând de la poziția poz, iar pwrite(fd, date, poz) scrie acolo, fără să schimbe poziția curentă a descriptorului. Sunt utile când mai multe fire citesc din același fișier.

readv() umple pe rând o listă de buffere modificabile (bytearray), iar writev() scrie mai multe bucăți dintr-un singur apel de sistem. preadv()/pwritev() combină cele două idei. readinto(fd, buffer) (3.14+) citește direct într-un buffer existent.

Parametri

Parametru Descriere
fd Descriptorul.
n / date / buffere Câți octeți, ce date sau ce buffere.
pozitie Poziția absolută în fișier.

Ce returnează

Bytes citiți sau numărul de octeți procesați.

Exemple

Exemplul 1: Acces la poziții fixe și buffere multiple

import os
fd = os.open("registru.bin", os.O_RDWR | os.O_CREAT | os.O_TRUNC)
print(os.writev(fd, [b"AAAA", b"BBBB", b"CCCC"]))
print(os.pread(fd, 4, 4), os.lseek(fd, 0, os.SEEK_CUR))
os.pwrite(fd, b"bb", 4)
print(os.pwritev(fd, [b"x", b"y"], 10))
os.lseek(fd, 0, os.SEEK_SET)
a, b = bytearray(6), bytearray(6)
print(os.readv(fd, [a, b]), a, b)
c, d = bytearray(2), bytearray(2)
print(os.preadv(fd, [c, d], 2), c, d)
buf = bytearray(3)
os.lseek(fd, 8, os.SEEK_SET)
print(os.readinto(fd, buf), buf)
os.close(fd)

Rezultat

12
b'BBBB' 12
2
12 bytearray(b'AAAAbb') bytearray(b'BBCCxy')
4 bytearray(b'AA') bytearray(b'bb')
3 bytearray(b'CCx')

Greșeli frecvente

  • Dai lui readv obiecte bytes (imutabile) și primești TypeError. Bufferele trebuie să fie modificabile, de exemplu bytearray.

Comenzi înrudite