2017-04-05 4 views
0

Ich habe eine Textdatei, die als Initialisierungsdatei für ein Modell dient. Es sieht wie folgt aus:Zeilen lesen und schreiben n mal

foo1 
foo2 
bar, foo, yolo 
1, 2, 3 
foo3 
foo4 

Linie 3 ist die Kopf- und 4 nimmt die Werte und die beiden Linien müssen abhängig werden wiederholt, wie groß x ist. Angenommen, x = 3. Die folgenden Zeilen sollten nicht überschrieben, sondern nach unten verschoben werden. Die Zeilen davor (foo1 & foo2) werden dynamisch generiert, es gibt also nicht unbedingt nur zwei Zeilen, daher kann ich nicht einfach auf deren Index zugreifen!

So sollte meine Datei wie folgt aussehen dann:

foo1 
foo2 
bar, foo, yolo 
1, 2, 3 
bar, foo, yolo 
1, 2, 3 
bar, foo, yolo 
1, 2, 3 
foo3 
foo4 

Meine Idee so weit:

initraw = open('fileX.txt', "r") #opening raw file for reading 
initwrite= open('fileY.txt', "w") #opening file for writing 
initline = initraw.readlines() #writing content of raw file into string 

x = 3 

for line in initline: 
    initwrite.writelines(line,) 
    if line.startswith('bar, foo, yolo'): 
     for i in range(x): 
      initwrite.writelines(initline[2]) 
      initwrite.writelines(initline[3]) 

initwrite.close() #closing file 
initraw.close() #closing raw file 

Jeder Vorschlag, wie diese zu lösen? Im Moment sieht das so aus:

foo1 
foo2 
bar, foo, yolo 
bar, foo, yolo 
1, 2, 3 
bar, foo, yolo 
1, 2, 3 
1, 2, 3 
foo3 
foo4 

Also muss ich die erste Zeile nach "bar, foo, yolo" überspringen.

+0

wird dies nicht die Grenzen zwischen der 'bar' Zeile schreiben und der' 1, 2, 3' Linie? Sie sollten nur die Indizes der Zeilen finden, nach denen die neuen Zeilen kommen sollen, und Sie werden 'insert' verwenden, um sie zu' initline' hinzuzufügen. (Das liegt daran, dass "readlines" eine "Liste" von Strings und keine Zeichenfolge zurückgibt) –

+0

@PatrickHaugh siehe meine letzte Änderung ... ja, du hast Recht. Aber die Anzahl der Zeilen vor den Zeilen, die ich replizieren muss, ist nicht festgelegt, daher muss ich leider 'startswith' verwenden. – GeoEki

Antwort

0

this helps:

x = 2 
    lines = [[item] for item in initrow.split('\n')] 
    lines[2:4] = lines[2:4] * x 

    print lines 
    #will output [['foo1'], ['foo2'], ['bar, foo, yolo'], ['1, 2, 3'], ['bar, foo, yolo'], ['1, 2, 3'], ['foo3'], ['foo4']] 
0
initraw = open('fileX.txt', "r") #opening raw file for reading 
initwrite= open('fileY.txt', "w") #opening file for writing 
initline = initraw.readlines() #writing content of raw file into string 

i = 0 
for line in initline: 
    x = 3 
    i =+ 1 
    if line.startswith('bar, foo, yolo'): 
     for x in range(0, x-1): 
      initwrite.writelines(initline[i+1]) 
      initwrite.writelines(initline[i+2]) 
    initwrite.writelines(line)  
initwrite.close() #closing file 
initraw.close() #closing raw file 
+0

Ich habe meinen Beitrag bearbeitet ... habe herausgefunden, dass ich mich "fortgefahren" habe, während Sie Ihre Antwort geschrieben haben. Trotzdem fehlt etwas. – GeoEki

+0

Bearbeitet, einige Zeilen im Code geändert. Ausgabe jetzt in Ordnung. – X0r

+0

ein weiterer Schnitt nach einer vorherigen Antwort: Die Zeilen davor werden dynamisch generiert, also ist die Anzahl der Zeilen zufällig! Ich kann also nicht über den Index darauf zugreifen ... tut mir leid, dass ich das nicht sofort gesagt habe. – GeoEki