Come aprire un file sia in lettura che in scrittura?


211

C'è un modo per aprire un file sia in lettura che in scrittura?

Come soluzione alternativa, apro il file per la scrittura, lo chiudo, quindi lo apro di nuovo per la lettura. Ma c'è un modo per aprire un file sia in lettura che in scrittura?


3
che problema stai risolvendo? forse esiste una soluzione migliore rispetto alla scrittura / lettura di un file, ad esempiommap
Roman Bodnarchuk,

1
Potresti darci il tuo codice così saremo in grado di risponderti. Puoi anche provare a dare un'occhiata: docs.python.org/tutorial/… . Comunque ho provato ad usare r + b e funziona. Inoltre, c'è qualche vantaggio nell'usare un descrittore di file nelle funzioni diff?
Artsiom Rudzenka,

@RomanBodnarchuk mmapè un'ottima idea, ma cosa succede se si ha a che fare con la concorrenza? C'è un modo per riservare l'accesso?
Dr_Zaszuś,

Risposte:


267

Ecco come leggere un file e quindi scriverlo (sovrascrivendo i dati esistenti), senza chiudere e riaprire:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

41
utilizzare a+per coprire il caso in cui il file non esiste (verrà creato)
Jossef Harush,

16
seek () e truncate () sono entrambi fondamentali!
smwikipedia,

4
@JossefHarush Nota che la documentazione per gli astati 'su alcuni sistemi Unix, significa che tutte le scritture si aggiungono alla fine del file indipendentemente dalla posizione di ricerca corrente'. In questo caso il f.seek(0)non funzionerà come previsto. Ho appena commesso un fallo su questo su Linux.
Graeme,

6
È meglio spiegare perché seeke truncateviene utilizzato qui. La maggior parte dei lettori proviene da Google e copia e incolla.
Shiplu Mokaddim,

8
Dopo aver letto il file, il puntatore del file (fp) si è spostato in avanti, quindi è necessario impostarlo all'inizio. Questo è ciò che seek(0)fa: posiziona l'fp in posizione 0( cioè l'inizio). truncate()tronca il file al numero di byte fornito, ovvero rimuove tutto il contenuto del file dopo il numero di byte specificato. Immagina che il tuo file abbia la stringa Hello, worlde scrivi Bye. In caso contrario, truncate()il contenuto alla fine lo sarà Byelo, world, poiché non hai mai eliminato il testo esistente nel file. truncate()tronca il file sull'fp corrente.
Illya Gerasymchuk,

48

r+è la modalità canonica per leggere e scrivere contemporaneamente. Questo non è diverso dall'uso della fopen()chiamata di sistema poiché file()/ open()è solo un piccolo wrapper attorno a questa chiamata del sistema operativo.


aggiunge il contenuto del file, non scrive dall'inizio
TomSawyer il

47

Riassumi i comportamenti I / O

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

e il ramo decisionale

inserisci qui la descrizione dell'immagine


Quale software hai usato per realizzare il diagramma ad albero?
Flux

Sarei interessato anche io - Dia?
nerdoc,

22

Ho provato qualcosa di simile e funziona come previsto:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

Dove:

f.read (size) - Per leggere il contenuto di un file, chiama f.read (size), che legge una certa quantità di dati e lo restituisce come una stringa.

E:

f.write (stringa) scrive il contenuto della stringa nel file, restituendo None.

Inoltre, se apri il tutorial di Python sulla lettura e la scrittura dei file , scoprirai che:

'r +' apre il file sia in lettura che in scrittura.

Su Windows, "b" aggiunto alla modalità apre il file in modalità binaria, quindi esistono anche modalità come "rb", "wb" e "r + b".


5
Anche leggere e scrivere funziona altrettanto bene usando la modalità 'r + b', ma devi usare f.seek (0) tra f.read () e f.write () per posizionare il cursore indietro all'inizio del file.
gaboroso

2
Nota che se i dati che stai scrivendo non sono più lunghi di quelli già presenti, non verranno troncati. Usa il truncatemetodo per fermarlo.
Flimm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.