2009-04-23 24 views
6

Cuando se ejecuta el siguiente código Python:seek(), a continuación, leer(), a continuación, escribir() en Python

>>> f = open(r"myfile.txt", "a+")   
>>> f.seek(-1,2)           
>>> f.read()            
'a'              
>>> f.write('\n')           

me sale el siguiente (útil) excepción:

Traceback (most recent call last):  
    File "<stdin>", line 1, in <module> 
IOError: [Errno 0] Error   

El mismo Lo que sucede cuando se abre con "r +".

¿Se supone que esto falla? ¿Por qué?

Editar:

  1. Obviamente, esto es sólo un ejemplo, no es lo que en realidad estoy tratando de ejecutar. Mi objetivo real era verificar que los archivos finalicen con "\ n", o agregar uno, antes de agregar las nuevas líneas.
  2. Estoy trabajando con Windows XP, y el problema existe tanto en Python 2.5 como en Python 2.6.
  3. I lograron pasar por alto el problema llamando a buscar() de nuevo:

    f = open (r "miarchivo.txt", "a +")
    f.seek (-1 , 2)
    f.read()
    'a'
    f.seek (-10,2)
    f.write ('\ n')

Los parámetros reales de la segunda llamada de buscar no parece importar.

+0

¿Qué sistema operativo y versión de python estás usando? Esto parece funcionar bien con Python 2.4.3 bajo Linux 2.6.17. –

+0

¿Eso es exactamente lo que quieres hacer, o es una simplificación? Si esa es la tarea a mano, ¿por qué no simplemente abrir como 'a' y luego llamar a f.write, sin ninguna búsqueda intermedia? – kyle

+0

También (para Lance), no está funcionando en absoluto en Python 2.5 en Windows XP. – kyle

Respuesta

4

Esto parece ser un problema específico de Windows - ver http://bugs.python.org/issue1521491 para un problema similar .

Aún mejor, una solución dada y explicó en http://mail.python.org/pipermail/python-bugs-list/2005-August/029886.html, insertar:

f.seek(f.tell()) 

entre el read() y write() llama.

+2

O, mejor dicho, f.seek (0, 1), para evitar una llamada de función adicional. – tzot

+0

Me encuentro con un problema similar que se resuelve con este truco, pero estoy usando Xubuntu 15.04 con Python 3.4.3. Ver [mi pregunta] (https://stackoverflow.com/questions/40552106/file-object-methods-write-or-writelines-start-writing-at-unexpected-position) –

2

el modo a + es para agregar, si desea leer & escribir, está buscando r +.

probar esto:

>>> f = open("myfile.txt", "r+") 
>>> f.write('\n') 

Editar:

que debería haber especificado su plataforma inicialmente ... hay problemas conocidos con buscar dentro de las ventanas. Al intentar buscar, UNIX y Win32 tienen diferentes finales de línea, LF y CRLF, respectivamente. También hay un problema con la lectura hasta el final de un archivo. Creo que estás buscando el desplazamiento de búsqueda (2) para el final del archivo, y luego continúas desde allí.

estos artículos pueden ser de interés para usted (el segundo más específicamente):

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-08/2512.html

http://mail.python.org/pipermail/python-list/2002-June/150556.html

+0

Es por eso que la pregunta de Daphna dice 'Lo mismo ocurre cuando se abre con "r +".' – sblom

0

funciona para mí:

$ echo hello > myfile.txt 
$ python 
Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49) 
[GCC 4.3.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('myfile.txt', 'r+') 
>>> f.seek(-1, 2) 
>>> f.tell() 
5L 
>>> f.read() 
'\n' 
>>> f.write('\n') 
>>> f.close() 

¿Estás en las ventanas? Si es así, intente con 'rb+' en lugar de 'r+' en el modo.

Cuestiones relacionadas