Variable Typ ändern

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
würzie
User
Beiträge: 7
Registriert: Samstag 15. April 2006, 11:23

Hallo zusammen.
Ich versuche gerade für Blender ein kleines Import Script zu schreiben.
Dabei sollen Daten aus einer Textdatei gelesen werde und als Koordinaten
für bestimmte Objekte dienen.
Leider scheitere ich an der Hürde die Daten in Zahlen (float) umzuwandeln.
Ich habe hier schon gesucht, bin aber mit dem was ich gefunden habe nicht zurecht gekommen.
Hier ist mein Code

Code: Alles auswählen

import Blender

def read(filename):
   datei = open(filename, "r")
   print datei
   zeilen = datei.readlines()
   zeilenzahl = len(zeilen)-1
   for n in range(0, zeilenzahl):
      data = zeilen[n].split()
      spaltenzahl = len(data)
      print 'zeile'
      print n
      for m in range(0, spaltenzahl):
          print data[m]
          print type(data[m])   
                        
def fs_callback(filename):
   read(filename)

if __name__ == '__main__':
   Blender.Window.FileSelector(fs_callback, "TXT", "*.txt")
Da ich mich erst 3 Tagen mit Python auseinandergesetzt habe ist mein
Code noch ein wenig umständlich. Es gibt da bestimmt noch elegantere
Lösungen. So wie er jetzt ist, ist er für mich sehr übersichtlich und in kleine Schritte unterteilt.
Kann mir jemand einen Tip geben.

Gruß Würzie

Ach ja, so sieht meine TXT Datei aus.

Code: Alles auswählen

224.000000   342.000000   499.000000   307.000000   499.000000   307.000000   
225.000000   342.000000   498.000000   308.000000   499.000000   307.000000   
226.000000   344.000000   498.000000   309.000000   499.000000   307.000000   
225.000000   346.000000   502.000000   311.000000   499.000000   307.000000   
220.000000   352.000000   511.000000   318.000000   499.000000   307.000000   
214.000000   361.000000   519.000000   327.000000   499.000000   307.000000   
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Das entscheidende Stichwort hast du ja schon genannt: :)

Code: Alles auswählen

>>> float("123.45")
123.45
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Lösung ist im Prinzip ganz einfach:

Code: Alles auswählen

f = float("42.42")
Dann fällt mir noch auf, dass du die Datei nach dem Lesen nicht schließt.

Deine for-Schleifen kanst du auch noch vereinfachen (ungetestet):

Code: Alles auswählen

def read(filename):
   zeilen= open(filename, "r")

   for zeile in zeilen:
      for spalte in zeile.split():
          print spalte
          print type(spalte)
          #Hier kannst du dann das "float(...)" einbauen.
EDIT: So ein böser Doppelpunkt hat sich versteckt...
Zuletzt geändert von EyDu am Mittwoch 9. Mai 2007, 12:04, insgesamt 1-mal geändert.
würzie
User
Beiträge: 7
Registriert: Samstag 15. April 2006, 11:23

Vielen Dank für die schellen Antworten.
Float. Das hatte ich schon versucht.
Funktioniert leider nicht.
Bei mir sieht das so aus.

Code: Alles auswählen

import Blender

def read(filename):
	datei = open(filename, "r")
	print datei
	zeilen = datei.readlines()
	zeilenzahl = len(zeilen)-1
	for n in range(0, zeilenzahl):
		data = zeilen[n].split()
		spaltenzahl = len(data)
		print 'zeile'
		print n
		for m in range(0, spaltenzahl):
		    float(data[m])#<<<<<<<<<<<<<<<<<<<<<<<<<
		    print data[m]
		    print type(data[m])	
								 
def fs_callback(filename):
	read(filename)

if __name__ == '__main__':
	Blender.Window.FileSelector(fs_callback, "TXT", "*.txt")
Das Ergebnis sieht so aus

Code: Alles auswählen

zeile
0
224.0000000
<type 'str'>
342.000000 
<type 'str'>
499.000000
<type 'str'>
...
Gruß Würzie
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Gehe ich richtig in der Annahme, dass du das Tutorial aus der Doku nicht richtig durchgearbeitet hast :shock: ?

Code: Alles auswählen

the_float = float("42.23")
würzie
User
Beiträge: 7
Registriert: Samstag 15. April 2006, 11:23

Hallo,
ich habe gerade noch etwas gebastelt und jetzt funktioniert es.
@EyDu Welches Tutorial aus der Doku???
Vielen Dank nochmal :)

Code: Alles auswählen

import Blender

def read(filename):
	datei = open(filename, "r")
	print datei
	zeilen = datei.readlines()
	zeilenzahl = len(zeilen)-1
	for n in range(0, zeilenzahl):
		data = zeilen[n].split()
		spaltenzahl = len(data)
		print 'zeile'
		print n
		for m in range(0, spaltenzahl):
		    test =float(data[m])
		    print test
		    print type(test)	
								 
def fs_callback(filename):
	read(filename)

if __name__ == '__main__':
	Blender.Window.FileSelector(fs_callback, "TXT", "*.txt")
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

DAS Python-Standard-Tutorial
BlackJack

Ist es richtig, das die letzte Zeile in der Datei nicht berücksichtigt werden soll? Falls die wichtig ist, solltest Du von der `zeilenanzahl` nichts abziehen.

Anstelle von `range()` wäre `xrange()` effizienter. Das erste erzeugt nämlich eine Liste mit den ganzen Zahlen.

Wenn Du in Python etwas sicherer bist und nicht immer alle Zwischenergebnisse an Namen binden möchtest, kann man das so schreiben:

Code: Alles auswählen

    datei = open(filename, 'r')
    for i, line in enumerate(datei):
        print 'zeile', i
        for zahl in map(float, line.split()):
            print zahl
    datei.close()
Antworten