os.open(), read(), write(), lseek(), close(), closerange() în Python

Lucrul de nivel jos cu fișierele, prin descriptori numerici, ca în C.

Sintaxă
fd = os.open(cale, flaguri, mode=0o777)
os.write(fd, date) / os.read(fd, n)
os.lseek(fd, pozitie, de_unde)
os.close(fd) / os.closerange(de_la, pana_la)

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