2012-02-03 16 views
5

Dopo aver letto alcuni post, sembra che tu possa aprire un file sia per la lettura che per la scrittura con la modalità 'r +' o 'w +'. Tuttavia, cercando di utilizzare queste modalità sempre mi danno risultati strani:python open ('file', 'r +') dando risultati strani

  1. Se uso 'r +', chiamare file.read(), e quindi chiamare file.write ('str'), ci sarà un errore di "IOError: [Errno 0] Errore"
  2. Se uso 'r +', chiama file.write ('str'), e poi chiama file.read(), ritornerà inaspettato e molto lungo contenuti (sembra l'interno di un oggetto )
  3. Se uso 'w +', chiamando file.read() restituirà una stringa vuota

Quello che sto cercando di fare è aprire un file, leggere il contenuto, modificarlo e riscriverlo. Attualmente lo apro con 'r', cambio il contenuto e lo apro di nuovo con 'w' e riscrivo. È un buon modo per farlo?

C'è un esempio a http://snipt.org/zglJ0

sto utilizzando Windows 7 e Python 2.7.2

+3

Potrebbe condividere uno snippet di codice che dimostra il problema? –

+0

I tre esperimenti precedenti sono tutti chiusi da file.close(). Tuttavia, sembra che eseguire sia read() che write() nello stesso esperimento (non chiamando close() in mezzo) porterà a risultati strani. –

+0

È presente su Windows e Linux? – tMC

risposta

5

Bisogna flush() quando si passa tra la lettura e la scrittura di un file che è stato aperto in un aggiornamento modalità. O penso che tu possa anche seek(). Questo è causato da alcuni comportamenti strani nell'implementazione di file di Windows in Python 2.x; l'hanno riparato in 3.x.

+0

Ciao Kindall! Grazie per la risposta, ma il metodo flush non sembra funzionare (Sì, sto usando windows e python 2.7.2). il mio codice come segue: '>>> f = aperto (' f1.txt ~ ',' r + ') >>> f.read() ' blablabl ' >>> f.flush() >> > f.write ('AAA') Traceback (chiamata più recente scorso): file "", linea 1, in f.write ('AAA') IOError: [Errno 0] Errore >> > f.close() ' –

+1

Si potrebbe provare 'f.seek (0, 1)' quindi (cercare la posizione corrente nel file). – kindall

+0

Questo funziona! In questo caso sembra più leggibile chiudere e riaprire per ogni azione diversa. –

Problemi correlati