seltsames Problem

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
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

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
Antworten