Seite 1 von 1

seltsames Problem

Verfasst: Samstag 6. November 2004, 15:47
von sonium

Code: Alles auswählen

def load():
	f = open('data.dat','r')
	objects = 0
	frames = 0
	global timestep
	timestep = 0
	i = 0
	x,y,z,Vx,Vy,Vz,mass = 0,0,0,0,0,0,0
	for line in f:
		if line[0] != '#':
			if line[:3] == "obj":
				objects = int(line[8:-1])
			if line[:3] == "fra":
				frames = int(line[7:-1])
			if line[:3] == "tim":
				timestep = int(line[9:-1])
			if objects != 0 and frames != 0 and timestep != 0:
				data = array(type= 'Float32', shape=(frames,objects,7))
				#if line[:3] == "nam":
				
				if line[:3] == "pos":
					x,y,z = map(float, line[4:].split(','))
				if line[:3] == "vel":
					Vx,Vy,Vz = map(float, line[4:].split(','))
				if line[:3] == "mas":
					mass = float(line[5:-1])
					data[0][i] = [x,y,z,Vx,Vy,Vz,mass]
					print data[0][0]
					print data[0][1]
					if i == (objects - 1):
						break
					i += 1
	f.close()
die funktion soll follgende datei auslesen:

Code: Alles auswählen

#Input Datei
objects 2
frames 10000
timestep 1000

#Objektdaten
name "Erde"
pos 0,0,0
vel 0,0,300.0
mass 5.977e24

name "Mond"
pos 3.84405e8,0,0
vel 0,1.03e3,300.0
mass 7.348e22
Das seltsam ist nun der output:

Code: Alles auswählen

[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
   0.00000000e+00   3.00000000e+02   5.97699988e+24]
[ 0.  0.  0.  0.  0.  0.  0.]

[ 0.  0.  0.  0.  0.  0.  0.]
[  3.84404992e+08   0.00000000e+00   0.00000000e+00   0.00000000e+00
   1.03000000e+03   3.00000000e+02   7.34800019e+22]
die Erste hälfte ist mir klar: Die datei wurde ausgelesen und die erste Zeile des Arrays ausgefüllt. Die zweite ist noch leer

Aber in der zweiten hälfte wirds echt sehr seltsam: Die erste Zeile ist aus unerfindlichen Gründen wieder leer und die zweite ist dem input entsprechend ausgefüllt. Woher kommt das? Ich hab jetzt ne geschlagene Stunde rum probiert und seh einfach den Fehler nicht. Falls mir einer sagen könnte, was ich falsch gemacht hab, wäre ich extrem dankbar.

Oder gibt es eine bessere und einfachere Möglichkeit Daten einzulesen als ein plaintext Datei zu parsen?

-- Sonium

Verfasst: Samstag 6. November 2004, 16:38
von Dookie
Hi sonium,

ich denke es liegt an den Leerzeilen.

Code: Alles auswählen

    for line in f:
        if line.strip() != "" and line[0] != '#':
            ...
Das initialisieren der Variablen mit 0 kannst du auch so machen:

Code: Alles auswählen

    x=y=z=Vx=Vy=Vz=mass = 0
und statt if line[:3] == "obj":

Code: Alles auswählen

            if line.startswith("obj"):
               ...
Gruß

Dookie

Verfasst: Samstag 6. November 2004, 16:50
von Milan
Hi. Außerdem würde ich aus Stilgründen noch die Abfrage zum überspringen ändern, da man dann nicht alles so weit einrücken muss und ein wenig mehr Übersicht behält:

Code: Alles auswählen

    for line in f: 
        if line.strip() == "" or line[0] == '#':
            continue
        if line[:3] == "obj":
            objects = int(line[8:-1])
        ...
mfG Milan

Verfasst: Samstag 6. November 2004, 18:10
von sonium
ok, danke sieht jetzt optisch schon mal viel besser aus aber der Fehler lag wo anders:

data = array(type= 'Float32', shape=(frames,objects,7))

wurde bei jedem durchlauf erneut ausgefüllt, und so das array jedesmal wieder auf 0 gesetzt *Kopf-gegen-die-Wand-schlag*

--Sonium