2015-07-19 14 views
19

Ho notato che, oltre ai caratteri in modalità documentata, Python 2.7.5.1 in Windows XP e 8.1 accetta anche le modalità U e D almeno durante la lettura dei file. La modalità U viene utilizzata in numpy genfromtxt. Modalità D ha l'effetto che il file viene eliminato, secondo il seguente frammento di codice:Modalità di apertura file Python

f = open('text.txt','rD') 
print(f.next()) 
f.close() # file text.txt is deleted when closed 

Qualcuno sa di più su queste modalità, in particolare se sono una caratteristica permanente della lingua applicabile anche su sistemi Linux?

+3

'open ('text.txt', 'rD')' per un file esistente su Linux non genera alcun errore per me, sebbene il file non venga cancellato quando chiuso. Sono davvero sorpreso che se fosse vero, questo comportamento è [non documentato] (https://docs.python.org/2/library/functions.html#open). La bandiera 'U' è comunque documentata. – rth

+2

Appena replicato su Windows. Questo è davvero strano. – tmr232

+3

Ho fatto lo stesso errore un momento fa. La menzione è [qui] (https://github.com/python/cpython/blob/2.7/Objects/fileobject.c#L209). Nel fileobject e non nell'io. – tmr232

risposta

8

Il flag D sembra essere specifico di Windows. Windows sembra aggiungere diversi flag alla funzione fopen nel suo CRT, come descritto in here.

Mentre Python filtra la stringa di modalità per assicurarsi che non si verifichino errori, consente alcuni dei flag speciali, come si può vedere nei sorgenti Python here. In particolare, sembra che la bandiera N viene filtrato, mentre i T e D bandiere sono consentiti:

while (*++mode) { 
    if (*mode == ' ' || *mode == 'N') /* ignore spaces and N */ 
     continue; 
    s = "+TD"; /* each of this can appear only once */ 
    ... 

suggerirei attaccare alle opzioni documentate per mantenere il cross-platform di codice.

+3

Vedere anche la documentazione su Windows [CreateFile] (https://msdn.microsoft.com/en-us/library/windows/desktop /aa363858%28v=vs.85%29.aspx). –

+2

"Suggerirei di attenermi alle opzioni documentate" yay! Vedi anche [modulo tempfile] (https://docs.python.org/2/library/tempfile.html?highlight=tempfile#tempfile.TemporaryFile) – msw

5

Questo è un po 'fuorviante. open() come la modalità arg accetta qualsiasi carattere, mentre si passa uno valido, ad esempio "w,r,b,+,a".

Così è possibile scrivere: open("fname", "w+ANYTHINGYOUWANT"). Aprirà il file come open("fname", "w+"). E open("fname", "rANYTHINGYOUWANT"). aprirà il file come open("fname", "w+").

Riguardo flag "U":

Oltre alla fopen standard() valori modalità può essere 'U' o 'ru'. Python è solitamente costruito con supporto universale per le nuove linee; fornendo 'U' apre il file come un file di testo, ma le linee possono essere terminate da uno qualsiasi di come segue: la convenzione di fine riga di Unix '\ n', la convenzione di Macintosh '\ r' o Windows convenzione '\ r \ n'. Tutte queste rappresentazioni esterne di sono viste come '\ n' dal programma Python. Se Python è stato creato senza newlines universali, una modalità con "U" è uguale alla normale modalità testo. Si noti che gli oggetti file così aperti anche hanno un attributo chiamato newlines che ha il valore None (se non sono ancora state visualizzate le newline ), '\ n', '\ r', '\ r \ n' o una tupla contenente tutti i tipi di nuova visione visti.

Come si può leggere nella documentazione Python https://docs.python.org/2/library/functions.html#open

EDIT:

D: Specifica un file temporaneo. Viene cancellato quando l'ultimo puntatore del file viene chiuso.

come potete leggere nel link di @ tmr232.

Il c, n, t, opzioni di modalità S, R, T, e D sono estensioni Microsoft per fopen e _fdopen e non dovrebbero essere utilizzati laddove ANSI portabilità è desiderare

ulteriore aggiornamento:

propongo di presentare il fenomeno come un bug, in quanto l'apertura di un file come di sola lettura cioè con la bandiera "r", quindi permette di cancellare dopo/via clos aggiungendo un singolo carattere come "D", penso che anche per caso sia un serio problema di sicurezza.

Ma, se questo ha alcune funzionalità inevitabili, per favore informami.

+1

Non potrei essere in grado di riprodurlo, ma forse questo è un altro problema di file latente, suppongo? – Geeocode

+1

@rth è stato riprodotto vedi la risposta di tmr232 sopra, vuoi fornire un riferimento per la documentazione di U? – NameOfTheRose

+0

@ GyörgySolymosi fornirà per favore Python e OS versione – NameOfTheRose