Si sta confondendo la funzione integrata open()
con os.open()
fornita dal modulo os
. Sono abbastanza diversi; os.open(filename, "w")
non è valido Python (os.open
accetta i flag di numero intero come secondo argomento), open(filename, "w")
è.
Insomma, open()
crea nuovi oggetti file, os.open()
crea descrittori di file a livello di sistema operativo, e os.fdopen()
crea un oggetto file da un descrittore di file.
I descrittori di file sono una funzionalità di basso livello per lavorare con i file forniti direttamente dal kernel del sistema operativo. Un descrittore di file è un piccolo numero intero che identifica il file aperto in una tabella di file aperti mantenuti dal kernel per ogni processo. Un certo numero di chiamate di sistema accetta i descrittori di file, ma non sono comodi da utilizzare, in genere richiedono buffer a larghezza fissa, tentativi multipli in determinate condizioni e gestione manuale degli errori.
Gli oggetti file sono classi Python che racchiudono i descrittori di file per rendere il lavoro con i file più conveniente e meno soggetto a errori. Forniscono, ad esempio, la gestione degli errori, il buffering, la lettura riga per riga, le conversioni del set di caratteri e vengono chiusi al termine della raccolta dei dati obsoleti.
per ricapitolare:
Built-in open()
prende un nome di file e restituisce un nuovo oggetto file Python. Questo è ciò di cui hai bisogno nella maggior parte dei casi.
os.open()
accetta un nome file e restituisce un nuovo descrittore di file. Questo descrittore di file può essere passato ad altre funzioni di basso livello, come os.read()
e os.write()
, oppure a os.fdopen()
, come descritto di seguito. Ne hai bisogno solo quando scrivi un codice che dipende dalle API dipendenti dal sistema operativo, come l'utilizzo del flag O_EXCL
su open(2)
.
os.fdopen()
prende un descrittore di file esistente - tipicamente prodotta dalle chiamate di sistema Unix come pipe()
o dup()
, e costruisce un oggetto file Python intorno ad esso. Effettivamente converte un descrittore di file in un oggetto file completo, che è utile quando si interfaccia con il codice C o con API che creano solo descrittori di file di basso livello.
incorporato open
può essere implementato utilizzando os.open()
(per creare un descrittore di file) e os.fdopen()
(ad avvolgerla in un oggetto di file):
# equivalent to open(filename, "r")
f = os.fdopen(os.open(filename, os.O_RDONLY))
Secondo [la documentazione] (http: //docs.python.org/2/library/os.html#os.open), os.open() restituisce un descrittore di file, mentre il builtin open() restituisce un oggetto file. – Octipi