Mi sembra di ricordare casi in lingue di livello inferiore che l'apertura di un file più di una volta in un programma potrebbe provocare un puntatore di ricerca condiviso. Di fare in giro in Python un po ', questo non sembra accadere per me:È sicuro aprire un file più volte contemporaneamente in Python?
$ cat file.txt
first line!
second
third
fourth
and fifth
>>> f1 = open('file.txt')
>>> f2 = open('file.txt')
>>> f1.readline()
'first line!\n'
>>> f2.read()
'first line!\nsecond\nthird\nfourth\nand fifth\n'
>>> f1.readline()
'second\n'
>>> f2.read()
''
>>> f2.seek(0)
>>> f1.readline()
'third\n'
È questo comportamento noto per essere sicuri? Sto facendo fatica a trovare una fonte che dice che va bene, e sarebbe di grande aiuto se potessi dipendere da questo.
Non vedo la posizione come un attributo dell'oggetto file, altrimenti avrei più fiducia in questo. So che potrebbe essere tenuto internamente nell'iteratore, ma idk come .tell() ci arriverebbe in quel caso.
>>> dir(f1)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__',
'__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__str__', 'close', 'closed', 'encoding', 'fileno', 'flush',
'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline',
'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines',
'xreadlines']
UPDATE
A pagina 161 di The Python Essential Reference si afferma
Lo stesso file può essere aperto più di una volta nello stesso programma (o in programmi diversi). Ogni istanza del file aperto ha il proprio puntatore del file che può essere manipolato in modo indipendente.
così sembra infatti essere al sicuro, comportamento definito
In python ogni volta che chiamate 'open()' crea un nuovo oggetto file (iteratore), quindi siete al sicuro. –
Non conosco nessuna piattaforma in cui si possa avere un problema nel mantenere diversi puntatori di ricerca qui. Ma ... è accettabile per il tuo caso di utilizzo che il tuo codice possa generare un'eccezione aprendo 'f2' in alcuni casi su Windows, anche se non fallisce mai su Unix? – abarnert
@abarnert Mi aspetto solo che questo venga eseguito su Windows e solo durante la lettura. L'apertura su Windows acquisirà normalmente blocchi esclusivi? –