2015-02-07 6 views
10

Ich versuche, eine Zeichenfolge an eine Datei anhängen, wenn die Zeichenfolge in der Datei nicht beendet wird. Das Öffnen einer Datei mit der Option a+ ermöglicht es mir jedoch nicht, dies sofort zu tun, da das Öffnen der Datei mit a+ den Zeiger an das Ende der Datei setzt, was bedeutet, dass meine Suche immer fehlschlägt. Gibt es einen guten Weg, dies zu tun, außer die Datei zu öffnen, um zuerst zu lesen, zu schließen und wieder zum Anhängen zu öffnen?Python: Öffnen Sie eine Datei, suchen Sie dann anhängen, wenn nicht existieren

In Code, scheinbar, unten funktioniert nicht.

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

Ich muss folgendes tun, um es zu erreichen.

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

Was Sie brauchen, ist der Suchvorgang http://www.tutorialspoint.com/python/file_seek.htm –

+1

Möchten Sie das für einen Teilstring, eine Zeile oder ein aktuelles Wort überprüfen? –

+0

Um. In meinem Fall ein Teilstring. –

Antwort

13

die Eingabedatei unverändert zu lassen, wenn needle auf jeder Linie ist oder die Nadel am Ende der Datei anhängen, wenn sie fehlt:

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 

Ich habe es getestet und es funktioniert sowohl auf Python 2 (stdio-basierte I/O) und Python 3 (POSIX lesen/schreiben-basierte I/O).

Der Code verwendet obskuren else nach einer Schleife Python-Syntax. Siehe Why does python use 'else' after for and while loops?

+0

Warum -1? Es scheint zu tun, was gewünscht wird ... – glglgl

+2

@glglgl: vielleicht ist ein Downvoter nicht vertraut mit der "' else' nach einer Schleife "-Syntax und sie dachten, dass ich die Einrückung falsch verwendet habe. – jfs

6

Sie können die aktuelle Position des Dateiobjekts mithilfe von file.seek() festlegen. Zu springen, um den Anfang einer Datei verwenden

f.seek(0, os.SEEK_SET) 

zu einer Datei Ende zu springen, verwenden

f.seek(0, os.SEEK_END) 

In Ihrem Fall, um zu überprüfen, ob eine Datei etwas enthält, und dann hängen Sie vielleicht append die Datei, würde ich so etwas tun:

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

Danke für diese Antwort. Ich ordnete den Inhalt der Datei, die ich überprüfte, neu an und irgendwie wurde der String, nach dem ich suchte, in der Datei dupliziert. Ich musste zuerst an den Anfang der Datei springen, indem ich 'f.seek (0, os.SEEK_SET)' benutzte, bevor ich die Überprüfung durchführte, die 'line_found' in deinem Fall war, und dann zum Ende der Datei springen, bevor ich darauf schreibe. –

Verwandte Themen