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
readvobiectebytes(imutabile) și primeștiTypeError. Bufferele trebuie să fie modificabile, de exemplubytearray.
Comenzi înrudite
os.open(), read(), write(), lseek(), close(), closerange(): Lucrul de nivel jos cu fișierele, prin descriptori numerici, ca în C.memoryview(): Oferă acces la memoria unui obiect binar (bytes, bytearray) fără să o copieze.bytes() și bytearray(): Secvențe de octeți (valori 0-255) pentru date binare: fișiere, rețea, text codificat.