@stephi_1011: Codewiederholungen vermeidet man mit Schleifen und/oder Funktionen. Wenn Du immer nahezu den gleichen Code hast, dann schreib eine Funktion die diesen Code einmal enthält und die Unterschiede als Argumente übergeben bekommt.
Der Name `row` für alle Zeilen einer Datei ist irreführend. Eine Liste mit Zeilen könnte man `lines` nennen. `row` für eine einzelne Zeile ist auch eher ungebräuchlich. Das ist eher eine Zeile in einer Tabelle, also beispielsweise ein Name für eine Liste mit Werten.
Konstantennamen werden per Konvention komplett in Grossbuchstaben geschrieben.
Da Du die Datei komplett in den Speicher liest ist in dem Code zu viel unter das ``with`` für die Eingabedatei eingerückt. Denn nach dem einlesen braucht man die Datei ja schon nicht mehr.
Die Abschnittsstartzeilen sind eindeutig, also kann man die Suchschleife nach dem man die Datei geschrieben hat, abbrechen, denn danach kommt der gleiche Abschnitt ja nicht noch einmal.
Zischenergebnis (ungetestet):
Code: Alles auswählen
def main():
with open(os.path.join(PATH, 'Test.ibl'), 'r') as in_file:
lines = list(in_file)
searchtext = 'begin section ! Side1 #0'
for i, line in enumerate(lines):
if searchtext in line:
with open(os.path.join(PATH, 'Test_lines1_s1_del.ibl'), 'w') as out_file:
out_file.writelines(lines[i+2:i+45])
break
searchtext = 'begin section ! Side1 #1'
for i, line in enumerate(lines):
if searchtext in line:
with open(os.path.join(PATH, 'Test_lines1_s2_del.ibl'), 'w') as out_file:
out_file.writelines(lines[i+2:i+45])
break
Und jetzt nehmen wir uns eine der beiden Kopien als Funktion heraus und ersetzen dann beide durch einen Aufruf der Funktion:
Code: Alles auswählen
def save_section(lines, start_line, filename):
for i, line in enumerate(lines):
if line.strip() == start_line:
with open(filename, 'w') as out_file:
out_file.writelines(lines[i+2:i+45])
break
def main():
with open(os.path.join(PATH, 'Test.ibl'), 'r') as in_file:
lines = list(in_file)
save_section(
lines,
'begin section ! Side1 #0',
os.path.join(PATH, 'Test_lines1_s1_del.ibl')
)
save_section(
lines,
'begin section ! Side1 #1',
os.path.join(PATH, 'Test_lines1_s2_del.ibl')
)
Die beiden Aufrufe sind auch fast gleich. Da kann man die Unterschiede über eine Schleife heraus ziehen (ungetestet):
Code: Alles auswählen
def main():
with open(os.path.join(PATH, 'Test.ibl'), 'r') as in_file:
lines = list(in_file)
for i in xrange(2):
save_section(
lines,
'begin section ! Side1 #{0}'.format(i),
os.path.join(PATH, 'Test_lines1_s{0}_del.ibl'.format(i + 1))
)
Der Code ist allerdings nicht besonders robust was die Eingabedateien angeht. Ich habe mir mal ein paar IBL-Dateien im Netz angeschaut und die 'begin'-Zeilen müssen nicht klein geschrieben sein. 'Begin Section ! Something' wäre beispielsweise auch möglich. Und ich habe auch Dateien gefunden bei denen 'Open Archlength' in der ersten Zeile stand, und solche bei denen die beiden Worte auf zwei Zeilen verteilt waren. Ich würde also nicht unbedingt darauf bauen das zum Beispiel zwischen 'begin section' und 'begin curve' keine Leerzeile stehen darf, womit das ``i+2`` dann falsch wäre. Ausserdem kann in einem Abschnitt mehr als eine 'curve' stehen und das jede 'curve' genau 43 Zeilen umfasst, dürfte auch ein extremer Sonderfall sein.
Die Vorgehensweise an sich ist auch ineffizient, die Zeilen für jeden Abschnitt immer wieder von vorne zu durchsuchen. Man könnte auch die Datei *einmal* durchsuchen und jedes mal wenn man einen (passenden) Abschnitt gefunden hat, den in eine Datei schreiben.
Ich frage mich auch ob diese Dateien tatsächlich gebraucht werden, und wenn ob es dann wirklich lauter Einzeldateien sein müssen, oder ob es nicht wirklich besser ist die IBL-Datei in eine passende Datenstruktur einzulesen. Wenn ich das nach den Beispielen im Netz richtig sehe, bestehen die aus Abschnitten und diese Abschnitte können 'curve's enthalten, die aus Zeilen mit Koordinaten bestehen. Abschnitte und 'curve's werden mit 'begin section ! bezeichner' und 'begin curve ! bezeichner' eingeleitet, wobei die Gross-/Kleinschreibung der 'begin'-Teile variieren kann und das 'begin' muss *nicht* am Zeilenanfang stehen!
Man könnte so eine Datei also beispielsweise in eine Liste mit Abschnitten parsen, die ihrerseits eine Liste mit 'curve's enthalten, die eine 2D-Liste mit den Koordinaten enthalten. Oder, da Abschnitte und 'curve's Bezeichner besitzen, Wörterbücher statt Listen. Je nach dem wie auf die Daten zugegriffen werden muss und ob beispielsweise ein Speichern als JSON geplant ist und dabei die Reihenfolgen der Werte eine Rolle spielen.