Ce face os.open(), read(), write(), lseek(), close(), closerange()
os.open() deschide un fișier și returnează un descriptor (un număr întreg). Flag-urile se combină cu |: O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL (eroare dacă există), O_TRUNC, O_APPEND. write() scrie bytes și returnează câți octeți a scris; read(fd, n) citește cel mult n octeți.
lseek(fd, poz, de_unde) mută poziția de citire/scriere (SEEK_SET de la început, SEEK_CUR, SEEK_END). close() închide descriptorul, iar closerange(a, b) închide toți descriptorii din interval. În codul obișnuit, open() este mult mai comod.
Parametri
| Parametru | Descriere |
|---|---|
cale, flaguri, mode |
Fișierul, modul de deschidere și permisiunile la creare. |
fd |
Descriptorul. |
date / n |
Octeții scriși / numărul maxim de octeți citiți. |
Ce returnează
open: descriptor. write: octeți scriși. read: bytes. lseek: noua poziție.
Exemple
Exemplul 1: Scriere, poziționare și citire
import os
fd = os.open("date.bin", os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0o644)
print(os.write(fd, "Salut, Iași!".encode()))
print(os.lseek(fd, 7, os.SEEK_SET))
print(os.read(fd, 100).decode())
print(os.lseek(fd, 0, os.SEEK_END))
os.close(fd)
Rezultat
13
7
Iași!
13
Exemplul 2: Creare exclusivă și closerange
import os
fd = os.open("blocare.lock", os.O_CREAT | os.O_EXCL | os.O_WRONLY)
try:
os.open("blocare.lock", os.O_CREAT | os.O_EXCL | os.O_WRONLY)
except FileExistsError:
print("Altă instanță rulează deja")
a = os.open("blocare.lock", os.O_RDONLY)
b = os.open("blocare.lock", os.O_RDONLY)
os.closerange(fd, max(a, b) + 1)
try:
os.close(b)
except OSError as e:
print("Deja închis:", e.strerror)
Rezultat
Altă instanță rulează deja
Deja închis: Bad file descriptor
Greșeli frecvente
- Scrii un text cu
os.write:TypeError: a bytes-like object is required. Codifică întâi cu.encode(). - Uiți
os.close(fd); descriptorii nu se închid automat și se pot epuiza.
Comenzi înrudite
open() și with: Deschide un fișier pentru citire sau scriere; cu with, fișierul este închis automat.os.pread(), pwrite(), readv(), writev(), preadv(), pwritev(), readinto(): Citire și scriere la o poziție dată sau în mai multe buffere deodată, fără a muta cursorul fișierului.os.fdopen(): Transformă un descriptor numeric într-un obiect fișier obișnuit.os.dup() și os.dup2(): Duplică un descriptor de fișier; dup2 îl copiază peste un număr ales, de exemplu peste ieșirea standard.