While True in einer for Schleife

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Takegath
User
Beiträge: 3
Registriert: Montag 13. März 2017, 13:52

Bring mir Python seit einer Woche bei und habe nun folgendes Problem. Ich habe eine Datei in eine Liste geladen.

Code: Alles auswählen

with open(datei, "r") as g:
	liste2 = list(g)
g.close()
Ich schreibe diese Liste zeilenweise in eine neue Datei. Sobald nun eine Bedinung für die Zeile zutrifft, soll er für alle nachfolgenden Zeilen eine Anweisung machen, bis eine zweite Bedingung zutrifft. Die erste Bedinung trifft aber nur für die eine Zeile zu. Die danachfolgenden Zeilen erfüllen nicht mehr die Bedingungen, was mich zu meinem Dilemma mit dem zeilenweisen Schreiben bringt...

Code: Alles auswählen

alles = ["MESH2D", "E4Q", "E3T", "ND", "E2L", "E3L", "NUM_MATERIALS_PER_ELEM", "E6T", "E8Q", "E9Q", "NS", "GM", "SI", "DY", "TU", "TD", "KEY", "PG", "PD", "BD", "BCPGC", "NUME", "BV", "BCDISP", "BEDISP", "MV", "MAT_DEF", "BEGPARAMDEF", "ENDPARAMDEF", "BEG2DMBC", "BCN", "BCS", "MAT", "END2DMBC", "MAT_VAL", "BEFONT"]
string1 = "END2DMBC"

with open('time1.txt', "w") as f:
	for n in liste2:
		nliste = n.split()
		set1 = set(nliste)
		set2 = set(alles)
		set3 = set1.intersection(set2)
		if len(set3) == 0:
			if nliste[0] != "0" or nliste[0] != "0.0":
				wert = "BCS "+"1 "+"1 "+nliste[1]+"\n"
				f.write(wert)
		else:
			pass
	f.write(string1+"\n")
f.close()
Der Inhalt der Datei, um den es geht, sieht so aus (nur ein kleiner Ausschnitt):
BCS 1 1 2 1.71724100e+002
BCS 2 1 3 4.77263000e+001
XYS 1 61 "Curve"
0.0 0.0
900.0 0.0624
1800.0 0.1872
2700.0 0.3744
3600.0 0.7488
4500.0 1.248
5400.0 1.9968
...
XYS 2 61 "Curve"
0.0 0.0
900.0 0.4529
1800.0 1.3587
2700.0 2.7174
3600.0 5.4348
4500.0 9.058
5400.0 14.4928
Habe wichtige Infos der Dateien mal hervorgehoben.

Er soll erkennen, wenn "XYS 1" dasteht, dass es Werte für "BCS 1 1" sind und wenn "XYS 2" in der Zeile vorkommt, dass die nachfolgenden Zeilen die Werte für "BCS 2 1" beinhalten. So soll er es letztendlich in die neue Dateien schreiben (time1.txt für BCS 1 1 und time2.txt für BCS 2 1 usw.), die dann für die Weiterverarbeitung genutzt werden.

Würde mich freuen, wenn ihr mir ein paar Anregungen /Tipps dazu geben könntet. Die "while True if bedingung: break" Variante funktioniert ja nicht, wegen dem zeilenweisen schreiben (for n in liste2).

Danke schonmal
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Takegath: ich habe noch nicht verstanden, was Du erreichen willst. "XYS" kommt in Deiner Liste alles doch gar nicht vor. Kannst Du ein Beispiel geben, was Du hast, was Du willst und wie Du das erreichen willst. Allgemein brauchst Du eine Variable, die den Zustand repräsentiert, der für die Modifikation der aktuellen Zeile in das gewünschte Format steht.
Takegath
User
Beiträge: 3
Registriert: Montag 13. März 2017, 13:52

XYS kommt bei dem Auszug aus der Datei 2x vor und ist dick geschrieben. Steht an erster Stelle der Zeile. Ich will folgendes in eine Datei schreiben.

aus Datei:
BCS 1 1 2 1.71724100e+002
BCS 2 1 3 4.77263000e+001
XYS 1 61 "Curve"
0.0 0.0
900.0 0.0624
1800.0 0.1872
2700.0 0.3744

Es soll erkennen nach XYS kommt eine 1 --> die Werte danach sind für "BCS 1 1 ..."
Und dann die Werte in diesem Format in die Datei schreiben:
BCS 1 1 0.0624
BSC 1 1 0.1872
BCS 1 1 0.3744
Bis XYS 2 in einer Zeile vorkommt. Da soll es erkennen, das jetzt danach die Werte für "BCS 2 1 ..." stehen usw.

aus Datei:
XYS 2 61 "Curve"
0.0 0.0
900.0 0.4529
1800.0 1.3587

in neue Datei:
BCS 2 1 0.4529
BCS 2 1 1.3587

Sry, dass es nicht deutlich genug beschrieben ist. Schau auf diese Zahlen schon länger :?

Bei mir hängt es, eine "do until" Formulierung zu erstellen, die mein gewünschtes Ergebnis liefert, da ich ja zeilenweise in Datei schreibe und im nächsten for-Durchlauf ja die Bedinung nichtmehr zutrifft und er nicht das macht was ich will :x
Takegath
User
Beiträge: 3
Registriert: Montag 13. März 2017, 13:52

habe jetzt einen Zaehler erstellt, der immer um 1 hochzählt, wenn der erste n.split-wert 0 oder 0.0 ist.

Code: Alles auswählen

i = 0
with open('time1.txt', "w") as f:
	for n in liste2:
		nliste = n.split()
		set1 = set(nliste)
		set2 = set(alles)
		set3 = set1.intersection(set2)
		if len(set3) == 0:
			if nliste[0] != "0" and nliste[0] != "0.0" and nliste[0] != "XYS" and i < 2:
				zeile1 = "BCS "+str(i)+" "+"1 "+nliste[1]+" "+wert1+"\n"
				f.write(zeile1)
			elif nliste[0] == "0" or nliste[0] == "0.0":
				i=i+1
			else:
				pass
		else:
			pass
f.close()
für die 2. Datei (time2.txt) ist dann i == 2 in der if anweisung und in der 3. Datei ist i == 3 usw...

Was müsste ich tun, wenn jetzt keine "Hilfszeile" wie "0.0 0.0" als Trennzeile fungieren könnte?
Antworten