2014-04-14 6 views
15

Mi chiedo cosa sta succedendo con il file open() modalità di validazione (Python2.7):Aprire i file in modalità "rock & roll"

>>> with open('input.txt', 'illegal') as f: 
...  for line in f: 
...   print line 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: mode string must begin with one of 'r', 'w', 'a' or 'U', not 'illegal' 

>>> with open('input.txt', 'rock&roll') as f: 
...  for line in f: 
...   print line 
... 
1 

2 

3 

Quindi, non posso aprire il file in modalità illegal, ma io può aprirlo nella modalità rock&roll. In quale caso viene effettivamente utilizzata la modalità per l'apertura del file?

Si noti che il python3 non posso usare sia illegal e rock&roll:

>>> with open('input.txt', 'rock&roll') as f: 
...  for line in f: 
...   print(line) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid mode: 'rock&roll' 
>>> with open('input.txt', 'illegal') as f: 
...  for line in f: 
...   print(line) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid mode: 'illegal' 

E, questo è fonte di confusione, perché il comportamento è diverso per python3.x?

+0

Mi ha dato una bella risata dopo aver letto la risposta di mgilson – smac89

risposta

17

La funzione Python 2.x open essenzialmente delega il suo lavoro alla funzione C libreria fopen. Sul mio sistema, la documentazione per fopen contiene:

The argument mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.):

vostri ock&roll è considerato "caratteri aggiuntivi".

In Python 3, allowed open modes are more restricted (in sostanza, sono consentite solo stringhe valide).

+3

Sì, stavo per dire che la mia ipotesi è che hanno semplicemente aggiunto la convalida dell'input alla funzione. – aruisdante

+1

Il comportamento di Python 3 può essere ottenuto su Python 2 con 'from io import open'. –

16

Il traceback precedente lo spiega bene:

"ValueError: mode string must begin with one of 'r', 'w', 'a' or 'U'"

"rock & roll" inizia con "r", quindi è apparentemente legale.

+0

Ok, ma perché il comportamento è diverso per python3.x? Questo è ciò che mi ha confuso un po '. – alecxe

+3

@alecxe - Molte cose sono diverse tra python2.7 e python3.x ... Gli sviluppatori probabilmente pensavano che fosse stupido accettare "rock & roll" come una modalità file anche se il 'fopen' del sistema lo permetteva, quindi loro probabilmente aggiunto qualche convalida in anticipo. – mgilson

+1

Il sistema 'io' in Python 3 è un'implementazione molto diversa rispetto a quella precedente di Python 2. Il nuovo sistema io è anche disponibile su Python 2.7 (e introdotto in 2.6). Dovresti vedere il comportamento di Py3 se usi 'import io; io.open ('input.txt', 'rock & roll') '. Maggiori informazioni: https://docs.python.org/2/library/io.html –