2009-03-17 24 views
12

En Python, las siguientes afirmaciones no funcionan:archivo Python modos de detalle

f = open("ftmp", "rw") 
print >> f, "python" 

me sale el error:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 9] Bad file descriptor 

Pero con el siguiente código funciona:

g = open("ftmp", "r+") 
print >> g, "python" 

Parece que necesito revisar los modos de archivo. ¿Cuáles son las complejidades profundas de los modos de apertura de archivos?

Respuesta

11

Como una adición a @Jarret Hardie's answer aquí es como el modo de archivo de comprobación de Python en la función fileio_init():

s = mode; 
while (*s) { 
    switch (*s++) { 
    case 'r': 
     if (rwa) { 
     bad_mode: 
      PyErr_SetString(PyExc_ValueError, 
        "Must have exactly one of read/write/append mode"); 
      goto error; 
     } 
     rwa = 1; 
     self->readable = 1; 
     break; 
    case 'w': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT | O_TRUNC; 
     break; 
    case 'a': 
     if (rwa) 
      goto bad_mode; 
     rwa = 1; 
     self->writable = 1; 
     flags |= O_CREAT; 
     append = 1; 
     break; 
    case 'b': 
     break; 
    case '+': 
     if (plus) 
      goto bad_mode; 
     self->readable = self->writable = 1; 
     plus = 1; 
     break; 
    default: 
     PyErr_Format(PyExc_ValueError, 
       "invalid mode: %.200s", mode); 
     goto error; 
    } 
} 

if (!rwa) 
    goto bad_mode; 

es decir: sólo se permiten caracteres "rwab+"; debe haber exactamente uno de "rwa", como máximo un '+' y 'b' es un noop.

+0

wow, ¿cómo funciona el while (* s) y el cambio (* s ++)? oO Por lo que veo, ¿rasgará la cadena char por char? Pero, ¿qué significa el * ++? – Qwerty

+2

@Qwerty: vea [¿Cómo funciona "while (* s ++ = * t ++)"?] (Http://stackoverflow.com/questions/810129/how-does-whiles-t-work) para entender '* s' , '* s ++' en C. – jfs

17

Mejor aún, deje que la documentación lo haga por usted: http://docs.python.org/library/functions.html#open. Su problema en la pregunta es que no hay modo "rw" ... es probable que desee 'r +' como escribió (o 'a +' si el archivo aún no existe).

+12

La documentación es insuficiente. No dice que no puedas tener 'r' y' w'. No dice cuál es la diferencia entre 'w +' y 'w' (¿qué significa exactamente" actualización "?), Y no dice si' a' busca el final del archivo (supongo que sí , pero tal vez no). Y no da una manera clara de abrir un archivo para leer y escribir, al principio, sin truncarlo. – Timmmm

0

De hecho, esto está bien, pero he encontrado un modo de "rw" en el zócalo en el seguimiento de código (por Python en S60) en las líneas 42 y 45:

http://www.mobilenin.com/mobilepythonbook/examples/057-btchat.html

+0

Ver http://docs.python.org/library/socket.html#module-socket. "Nota: algunos comportamientos pueden depender de la plataforma, ya que las llamadas se realizan a las API del socket del sistema operativo". Entonces suena como una característica específica de S60. –

+0

También me gustaría señalar que r + y a + habilitan tanto la lectura como la escritura. Abra un archivo con r +, y puede buscar() alrededor del archivo a voluntad, sobrescribiendo o agregando contenido. ¿Hay alguna característica que esperas que la serie '+' no brinde? –

Cuestiones relacionadas