Schleife für mehrere Dateien nutzen und Problematik mit leeren Zeilen
Verfasst: Montag 22. April 2019, 10:09
Guten Tag,
ich hatte zwar mal einen Kurs in den Grundlagen von Python, damals Version 2.7, bin aber dennoch Anfänger. Nun nutze ich Python 3.7 mittels Spyder (Anaconda) für einen aktuellen Simulations-Kurs von Evakuierungen an der Uni. Das Programm erzeugt für jede Tür eine Datei mit drei "Header"-Zeilen, einer leeren Zeile und dann jeweils die Zeit und kumulierte Personenanzahl (mit zwei Leerzeichen dazwischen) und anschließend zwei leere Zeilen.
Mein Ziel ist es einen Graphen zu erzeugen (x= Personenanzahl, y=Zeit). Dazu nutze ich matplotlib.pyplot und muss dafür je eine Liste für die x und y Koordinate erzeugen.
Mein Ansatz ist der folgende:
Dies funktioniert an sich und ich kann die Graphen erzeugen, aber mit Einschränkungen. Ich muss die zweite leere Zeile der Tür-Datei löschen, sonst erhalte ich zunächst den Fehler: could not convert string to float bei Zeile 23 time1.append... , weil der letzte Eintrag der Liste ein Leerzeichen ist. Wenn ich die Anzahl an leeren Zeilen in der Tür-Datei erhöhe, erhalte ich auch mehr Leerzeichen-Einträge in der time1 Liste, aber immer einen weniger als es leere Zeilen gibt. Da habe ich ein Verständnis Problem. Es würde sich logisch anfühlen wenn der Code mit leeren Zeilen am Ende generell nicht funktioniert, aber warum eine leere Zeile kein Problem erzeugt aber ab 2 schon, verstehe ich nicht.
Ich habe versucht das Problem zu lösen:
Zwar wird bei zwei leeren Zeilen nun kein Leerzeichen mehr am Ende der Liste hinzugefügt (bei höherer Anzahl leerer Zeilen schon, dachte das break würde dies verhindern), aber abseits des ersten Eintrags in der time1 Liste fehlt bei allen das erste Zeichen. Ich denke das liegt daran, dass der Pointer das erste Zeichen mit readline(1) bearbeitet hat und nun dahinter weitermacht. Stimmt es, dass der Pointer nicht wieder an den Anfang der Zeile gesetzt werden kann?
Desweiteren beruht meine Methode darauf, dass ich für jede auszuwertende Datei händisch cntX=0 und die Liste für timeX (teilweise auch pedX) erstellen, sowie die Schleife kopiere und deren Inhalt auf die Datei und Liste(n) etc. anpasse. X steht für 1,2,3... abhängig von der Anzahl der Dateien. Ich habe versucht das mit einer Schleife mit range zu lösen:
Das funktioniert natürlich nicht, weil die Namen fi, cnti und timei nicht definiert sind. Bin ich da denn auf der richtigen Spur? Bzw. ist es generell möglich eine Schleife für mehrere Dateien zu nutzen und jeweils eine andere Liste zu füllen, oder im optimal Fall eine neue Liste automatisch pro Datei zu erzeugen?
Ich bin leider zu keinem der Probleme fündig geworden. Wie gesagt, ich kann grundsätzlich mit meinem Code mein Ziel erreichen, wenn auch durch händische Anpassungen. Daher denke ich, dass dieser stark optimiert werden kann und ich würde gerne verstehen wie und wo meine Denkfehler bei dem leeren Zeilen und meinem Lösungsansatz sind, um zu lernen. Daher bin ich für jede Hilfe, Denkanstöße, alternative Ansätze etc. sehr dankbar.
Liebe Grüße
Morgoth_der_Beginner
ich hatte zwar mal einen Kurs in den Grundlagen von Python, damals Version 2.7, bin aber dennoch Anfänger. Nun nutze ich Python 3.7 mittels Spyder (Anaconda) für einen aktuellen Simulations-Kurs von Evakuierungen an der Uni. Das Programm erzeugt für jede Tür eine Datei mit drei "Header"-Zeilen, einer leeren Zeile und dann jeweils die Zeit und kumulierte Personenanzahl (mit zwei Leerzeichen dazwischen) und anschließend zwei leere Zeilen.

Mein Ziel ist es einen Graphen zu erzeugen (x= Personenanzahl, y=Zeit). Dazu nutze ich matplotlib.pyplot und muss dafür je eine Liste für die x und y Koordinate erzeugen.
Mein Ansatz ist der folgende:
Code: Alles auswählen
#Dateien
f1 = open('a2_1_traj.txt_flow_exit_id_2.dat' , 'r')
f2 = open('a2_2_traj.txt_flow_exit_id_2.dat' , 'r')
time1 = []
time2 = []
ped = []
# um Header nicht zu beachten
cnt1 = 0
cnt2 = 0
# Schleifen
for line in f1:
cnt1 += 1
if cnt1 > 4: # Anpassen, Zeilen "Header"
line = line.rstrip('\n')
# line = line.rstrip('\r')
line = line.split(' ')
time1.append(float(line[0]))
ped.append(int(line[1]))
for line in f2:
cnt2 += 1
if cnt2 > 4: # Anpassen, Zeilen "Header"
line = line.rstrip('\n')
# line = line.rstrip('\r')
line = line.split(' ')
time2.append(float(line[0]))
Ich habe versucht das Problem zu lösen:
Code: Alles auswählen
for line in f1:
cnt1 += 1
if cnt1 > 4:
if f1.readline(1) != ' ':
line = line.rstrip('\n')
line = line.rstrip('\r')
line = line.split(' ')
time1.append(float(l[0]))
ped.append(int(l[1]))
else:
break
Desweiteren beruht meine Methode darauf, dass ich für jede auszuwertende Datei händisch cntX=0 und die Liste für timeX (teilweise auch pedX) erstellen, sowie die Schleife kopiere und deren Inhalt auf die Datei und Liste(n) etc. anpasse. X steht für 1,2,3... abhängig von der Anzahl der Dateien. Ich habe versucht das mit einer Schleife mit range zu lösen:
Code: Alles auswählen
for i in range(1,3):
for line in fi:
cnti += 1
if cnti >4:
line = line.rstrip('\n')
# line = line.rstrip('\r')
line = line.split(' ')
timei.append(float(line[0]))
ped.append(int(line[1]))
Ich bin leider zu keinem der Probleme fündig geworden. Wie gesagt, ich kann grundsätzlich mit meinem Code mein Ziel erreichen, wenn auch durch händische Anpassungen. Daher denke ich, dass dieser stark optimiert werden kann und ich würde gerne verstehen wie und wo meine Denkfehler bei dem leeren Zeilen und meinem Lösungsansatz sind, um zu lernen. Daher bin ich für jede Hilfe, Denkanstöße, alternative Ansätze etc. sehr dankbar.
Liebe Grüße
Morgoth_der_Beginner