2016-04-06 8 views
1

Was ich tun möchte, ist in einen Wert in einen bestimmten Teil einer Datei schreiben. Dieser Teil kann irgendwo in der Datei sein, wird aber nur einmal angezeigt, daher glaube ich nicht, dass das Hinzufügen einer Zeile das Problem lösen wird.Python - Schreiben Sie in einen bestimmten Teil der Datei, nicht nach Zeile - Regex

Was ich habe, ist im Wesentlichen eine Textdatei mit:

TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [] 
) 

Was Ich mag würde eine Zeichenfolge in die Datei direkt in der [] nach Schlagwörter = zu tun ist hinzuzufügen.

Would wie folgt aussehen:

TitleThing (
Some info = 22 
Otherthing -- "56.foo" 
(More info = 22.2) 

Tags = ["newtag"] 
) 

Das andere Problem ist, dass es möglicherweise vorhandene Tags sein:

TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = ["oldtag, othertag"] 
) 

In dieser Situation Ich mag würde meinen "NEWTAG", um die austretende Liste hinzuzufügen, so dass es zuerst erscheint.

Ich habe Anfang mit

tagRegex = re.compile(r'Tags = [(.*)]') 

Aber ich bin nicht sicher, wie es weitergeht.

Ich würde gerne etwas Hilfe!

Danke.

+0

Du brauchst keine Regex b ut Sie müssen in eine temporäre Datei schreiben –

+0

danke für die Antwort! Könntest du erklären? – flec8

+0

Sie suchen nach 'Tags = ...'? –

Antwort

0

Sie müssen in eine temporäre Datei schreiben, dann das Original überschreiben.

from tempfile import NamedTemporaryFile 
from shutil import move 


def add_new(new): 
    with open("check.txt") as f, NamedTemporaryFile("w",delete=False) as tmp: 
     for line in f: 
      if line.startswith("Tags ="): 
       repl = ", {}]".format(new) if "[]" not in line else "{}]".format(new) 
       tmp.write(line.replace("]", repl)) 
       tmp.writelines(f) 
       break 
      tmp.write(line) 
    move(tmp.name, "check.txt") 

Dann einfach in den neuen Wert übergeben:

In [3]: cat check.txt 
TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [] 
) 
In [4]: add_new("newvalue") 

In [5]: cat check.txt 
TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [newvalue] 
) 
In [6]: add_new("newvalue2") 

In [7]: cat check.txt 
TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [newvalue, newvalue2] 
) 

Wenn Sie den neuen Wert zu Beginn wollten, müssen Sie leicht die Logik einfach ändern: auf

repl = "[{}, ".format(new) if "[]" not in line else "[{}".format(new) 
    tmp.write(line.replace("[", repl)) 

Basierend Dein Kommentar ändere das if zu:

if '"Tags": [' in line: 
+0

Das sieht richtig aus, aber wenn ich es ausführe, wird die Datei nicht geschrieben. Ich bin mir nicht sicher, was ich falsch mache. – flec8

+0

@ flec8 ,. Es ist definitiv richtig, basierend auf dem, was Sie zur Verfügung gestellt haben. Sind Sie sicher, dass Sie die richtige Zeichenfolge verwenden, um zu passen und keine führenden Leerzeichen zu haben? –

+0

ah du hast Recht! was ich habe, ist TitleThing ( Einige info = 22 (Mehr info = 22,2) "Variablen" [], ) – flec8

0

Eine schmutzige Idee: Sie die Zeile mit Tags = ... lesen konnte, bewerten, bearbeiten die Liste, dann ist es umschreiben:

exec('Tags = ["newtag"]') 
Tags.append("othertag") 
f.write('Tags = {}'.format(Tags)) 

wo f eine neue Datei ist, wo Sie die bearbeitete Version schreiben (oder verwenden temporäre Datei wie in der anderen Antwort).

(Natürlich ist es immer gefährlich, eine beliebige Zeichenfolge auszuführen, aber das funktioniert, wenn es sich um eine einmalige Skript.)

Verwandte Themen