2009-04-23 21 views
6

Quando si esegue il seguente codice Python:seek(), quindi leggere(), poi scrivere() in python

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

ottengo il seguente (utile) eccezione:

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

Lo stesso cosa succede quando openning con "r +".

è questo dovrebbe fallire? Perché?

Edit:

  1. Ovviamente, questo è solo un esempio, non quello che sto effettivamente cercando di eseguire. Il mio obiettivo era verificare che i file terminassero con "\ n", o aggiungerne uno, prima di aggiungere le nuove linee.
  2. sto lavorando sotto Windows XP, e loro problema esiste sia in Python 2.5 e Python 2.6.
  3. sono riuscito a bypassare il problema chiamando seek() di nuovo:

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

i parametri attuali del 2 ° cercare chiamata non sembra avere importanza.

+0

Quale sistema operativo e versione Python stai usando? Questo sembra funzionare bene con Python 2.4.3 sotto Linux 2.6.17. –

+0

È esattamente quello che vuoi fare o è una semplificazione? Se questo è il compito a portata di mano, perché non aprirlo come 'a' e quindi chiamare f.write, senza ricerca intermedia? – kyle

+0

Inoltre (per Lance), non funziona affatto in Python 2.5 su Windows XP. – kyle

risposta

4

Questo sembra essere un problema specifico per Windows - vedi http://bugs.python.org/issue1521491 per un problema simile .

Ancora meglio, una soluzione dato e spiegato http://mail.python.org/pipermail/python-bugs-list/2005-August/029886.html, inserto:

f.seek(f.tell()) 

tra read() e write() chiama.

+2

Oppure, f.seek (0, 1), per evitare una chiamata di funzione aggiuntiva. – tzot

+0

Ho riscontrato un problema simile risolto con questo trucco, ma sto usando Xubuntu 15.04 con Python 3.4.3. Vedi [la mia domanda] (https://stackoverflow.com/questions/40552106/file-object-methods-write-or-writelines-start-writing-at-unexpected-position) –

2

l'una + modalità è per l'aggiunta, se si desidera leggere & scrittura, siete alla ricerca di R +.

provare questo:

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

Modifica:

si dovrebbe avere specificato vostra piattaforma inizialmente ... vi sono noti problemi con la ricerca all'interno di Windows. Quando si cerca di cercare, UNIX e Win32 hanno terminazioni di linea diverse, rispettivamente LF e CRLF. C'è anche un problema con la lettura fino alla fine di un file. Penso che tu stia cercando l'offset seek (2) per la fine del file, quindi prosegua da lì.

questi articoli possono essere di interesse per voi (il secondo più precisamente):

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

Ecco perché la domanda di Daphna dice "La stessa cosa succede quando operi con" r + "." – sblom

0

funziona per me:

$ 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() 

Sei su Windows? In tal caso, provare 'rb+' anziché 'r+' nella modalità.

Problemi correlati