2015-02-07 17 views
10

Sto provando ad aggiungere una stringa ad un file, se la stringa non esce nel file. Tuttavia, l'apertura di un file con l'opzione a+ non mi consente di farlo subito, perché l'apertura del file con a+ metterà il puntatore alla fine del file, il che significa che la mia ricerca fallirà sempre. C'è un buon modo per fare questo oltre ad aprire il file da leggere prima, chiudere e aprire di nuovo per aggiungere?Python: Apri un file, cerca poi aggiungi, se non esiste

Nel codice, a quanto pare, di seguito non funziona.

file = open("fileName", "a+") 

Ho bisogno di fare seguito per realizzarlo.

file = open("fileName", "r") 
... check if a string exist in the file 
file.close() 

... if the string doesn't exist in the file 
file = open("fileName", "a") 
file.write("a string") 
file.close() 
+2

quello che ti serve è l'operazione di ricerca http://www.tutorialspoint.com/python/file_seek.htm –

+1

vuoi controllare la sottostringa, una linea o una parola effettiva? –

+0

Um. Nel mio caso, una sottostringa. –

risposta

13

lasciare il file di input invariato se needle è su qualsiasi linea o aggiungere l'ago alla fine del file se non è presente:

with open("filename", "r+") as file: 
    for line in file: 
     if needle in line: 
      break 
    else: # not found, we are at the eof 
     file.write(needle) # append missing data 

ho provato e funziona sia su Python 2 (stdio a base di I/O) e Python 3 (POSIX lettura/scrittura a base di I/O).

Il codice utilizza l'oscuro else dopo una sintassi Python loop. Vedi Why does python use 'else' after for and while loops?

+0

Perché -1? Sembra fare ciò che si vuole ... – glglgl

+2

@glglgl: forse un down-motor non ha familiarità con la sintassi "' else' after a loop "e pensavano che io abbia usato il rientro in maniera errata. – jfs

6

È possibile impostare la posizione corrente dell'oggetto file utilizzando file.seek(). Per passare all'inizio di un file, utilizzare

f.seek(0, os.SEEK_SET) 

Per passare alla fine di un file, utilizzare

f.seek(0, os.SEEK_END) 

Nel tuo caso, per verificare se un file contiene qualcosa, e poi magari aggiungere accodamento per il file, mi piacerebbe fare qualcosa di simile:

import os 

with open("file.txt", "r+") as f: 
    line_found = any("foo" in line for line in f) 
    if not line_found: 
     f.seek(0, os.SEEK_END) 
     f.write("yay, a new line!\n") 
+0

Grazie per questa risposta. Ho riorganizzato il contenuto del file che stavo controllando e in qualche modo la stringa che stavo facendo il controllo stava diventando duplicata nel file. Ho dovuto saltare all'inizio del file prima usando 'f.seek (0, os.SEEK_SET)' prima di eseguire il controllo che è 'line_found' nel tuo caso, quindi saltare alla fine del file prima di scriverci sopra. –

Problemi correlati