2010-06-03 19 views
456

Qual è il modo migliore per aprire un file come letto/scrittura se esiste, o se non lo fa, quindi crearlo e aprirlo come letto /Scrivi? Da quello che ho letto, file = open('myfile.dat', 'rw') dovrebbe farlo, giusto?open() in Python non crea un file se non esiste

Non funziona per me (Python 2.6.2) e mi chiedo se si tratta di un problema di versione, o non dovrebbe funzionare così o cosa.

La linea di fondo è che ho solo bisogno di una soluzione per il problema. Sono curioso delle altre cose, ma tutto ciò di cui ho bisogno è un bel modo per fare la parte iniziale.

UPDATE: la directory di cinta era scrivibile da utente e gruppo, senza altro (io sono su un sistema Linux ... quindi i permessi 775, in altre parole), e l'errore esatto è stato:

IOError: no such file or directory.

+2

Come indicato da S.Mark, questo dovrebbe "funzionare". La directory allegata è scrivibile? – Rakis

+8

"non funziona per me"? Cosa significa, in particolare? Si prega di fornire il messaggio di errore effettivo. –

+4

La risposta di muksie sotto funzionava (e anche quella di Baloo per quella questione), ma solo per completezza, la dir allegata era scrivibile da utente e gruppo, non da altro (im su un sistema linux ... quindi permetti 775 in altre parole), e errore esatto era IOError: nessun file o directory di questo tipo. Grazie per l'aiuto ragazzi. – trh178

risposta

578

Si dovrebbe usare file = open('myfile.dat', 'w+')

+73

'w' tronca il file esistente. doc: * Modes ''r +'', ''w +'' e ''a +'' apri il file per l'aggiornamento (nota che ''w +'' tronca il file). * – SilentGhost

+4

questo ha fatto il trucco. grazie. mi sento un idiota ora per non leggere le specifiche. non penso che 'rw' sia accettabile anche lì. devo aver pensato a qualcos'altro. – trh178

+55

Si noti che un + crea un file se non esiste e, soprattutto, cerca il file fino alla fine. Quindi se fai una lettura subito dopo aver aperto in questo modo, non otterrai nulla. Per prima cosa devi cercare all'inizio: f.seek (0) –

7

open('myfile.dat', 'a') funziona per me, va bene.

in py3k il codice solleva ValueError:

>>> open('myfile.dat', 'rw') 
Traceback (most recent call last): 
    File "<pyshell#34>", line 1, in <module> 
    open('myfile.dat', 'rw') 
ValueError: must have exactly one of read/write/append mode 

in python-2.6 si solleva IOError.

23

Change "rw" per "w +"

O uso 'A +' per l'aggiunta (non cancellare il contenuto esistente)

29
>>> import os 
>>> if os.path.exists("myfile.dat"): 
...  f = file("myfile.dat", "r+") 
... else: 
...  f = file("myfile.dat", "w") 

r + significa leggere/scrivere

+38

Questo è Unpythonic. Anziché [controllare se il file esiste per primo] (http://docs.python.org/3/glossary.html#term-lbyl), si dovrebbe [si presuppone che faccia prima, quindi gestisca il caso che non lo sia] (http://docs.python.org/3/glossary.html#term-eafp). –

+20

ancora peggio, questo codice è soggetto a condizioni di gara. quindi, dopo aver verificato se il file esiste, il processo potrebbe essere interrotto e un altro processo potrebbe creare questo file. – antibus

6

Cosa vuoi fare con il file? Solo scrivere o leggere e scrivere?

'w', 'a' consentirà di scrivere e creerà il file se non esiste.

Se è necessario leggere da un file, il file deve esistere prima di aprirlo. Puoi testare la sua esistenza prima di aprirla o usare una prova/eccetto.

+3

I test di esistenza prima dell'apertura potrebbero introdurre una condizione di competizione. Probabilmente non è un grosso problema in questo caso, ma qualcosa da tenere a mente. –

+1

"Se è necessario leggere da un file, il file deve esistere prima di aprirlo." Grazie per aver salvato la mia sanità mentale. –

90

Il vantaggio del seguente approccio è che il file è correttamente chiuso alla fine del blocco, anche se viene sollevata un'eccezione durante il percorso. È equivalente a try-finally, ma molto più breve.

with open("file.dat","a+") as f: 
    f.write(...) 
    ... 

a+ Opens a file for both appending and reading. The file pointer is at the end of the file if the file exists. The file opens in the append mode. If the file does not exist, it creates a new file for reading and writing. - Python file modes

seek() method imposta la posizione corrente del file.

f.seek(pos [, (0|1|2)]) 
pos .. position of the r/w pointer 
[] .. optionally 
() .. one of -> 
    0 .. absolute position 
    1 .. relative position to current 
    2 .. relative position from end 

Only "rwab+" characters are allowed; there must be exactly one of "rwa" - see Stack Overflow question Python file modes detail.

+0

Provo questo con open (nomefile, 'a +') come myfile: e ottieni IOError: [Errno 2] Nessun file o directory di questo tipo: - perché non crea il file? – Loretta

+0

@Loretta Hai controllato il valore di 'nomefile'? – Qwerty

+0

Sì, l'ho fatto. È una stringa unicode. Ho anche provato con open ('{}. Txt'.format (filename),' a + ') come myfile: – Loretta

7

penso che sia r +, non rw. Sono solo un antipasto, ed è quello che ho visto nella documentazione.

11

La mia risposta:

file_path = 'myfile.dat' 
try: 
    fp = open(file_path) 
except IOError: 
    # If not exists, create the file 
    fp = open(file_path, 'w+') 
4

Usa:

import os 

f_loc = r"C:\Users\Russell\Desktop\ip_addr.txt" 

if not os.path.exists(f_loc): 
    open(f_loc, 'w').close() 

with open(f_loc) as f: 
    #Do stuff 

Assicurarsi di chiudere i file dopo di aprirli. Il gestore contesto with farà questo per te.

26

buona pratica è quella di utilizzare il seguente:

import os 

writepath = 'some/path/to/file.txt' 

mode = 'a' if os.path.exists(writepath) else 'w' 
with open(writepath, mode) as f: 
    f.write('Hello, world!\n') 
+5

È sbagliato testare un file prima di aprirlo, in quanto può portare a condizioni di competizione (il file viene cancellato prima che venga aperto). A volte le condizioni di gara possono essere utilizzate per sfruttare vulnerabilità in un sistema. La modalità "a +" è il modo migliore per aprire il file: crea un nuovo file e aggiunge file esistenti. Non dimenticare di avvolgere questo in una prova/eccetto. – sleblanc

5

Put w + per la scrittura del file, il troncamento se esiste, r + per leggere il file, la creazione di uno se non esistono, ma non scrivere (e return null) o a + per creare un nuovo file o aggiungerlo a uno esistente.

0

Quindi si desidera scrivere i dati in un file, ma solo se non esiste già ?.

Questo problema può essere facilmente risolto utilizzando la modalità x meno conosciuta per open() invece della solita modalità w. Ad esempio:

>>> with open('somefile', 'wt') as f: 
...  f.write('Hello\n') 
... 
>>> with open('somefile', 'xt') as f: 
...  f.write('Hello\n') 
... 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
FileExistsError: [Errno 17] File exists: 'somefile' 
    >>> 

Se il file è in modalità binaria, utilizzare la modalità xb anziché xt.

1
''' 
w write mode 
r read mode 
a append mode 

w+ create file if it doesn't exist and open it in write mode 
r+ create file if it doesn't exist and open it in read mode 
a+ create file if it doesn't exist and open it in append mode 
''' 

esempio:

file_name = 'my_file.txt' 
f = open(file_name, 'w+') # open file in write mode 
f.write('python rules') 
f.close() 

Spero che questo aiuta. [FYI sto usando Python versione 3.6.2

1

Se si desidera aprirlo per leggere e scrivere, presumo che non si voglia troncarlo mentre lo si apre e si desidera poter leggere il file subito dopo averlo aperto. Quindi questa è la soluzione che sto usando:

file = open('myfile.dat', 'a+') 
file.seek(0, 0)