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

Variable Typ ändern

Beitragvon würzie » Mittwoch 9. Mai 2007, 10:17

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:

Beitragvon Rebecca » Mittwoch 9. Mai 2007, 10:24

Das entscheidende Stichwort hast du ja schon genannt: :)

Code: Alles auswählen

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

Beitragvon EyDu » Mittwoch 9. Mai 2007, 10:28

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

Beitragvon würzie » Mittwoch 9. Mai 2007, 10:42

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: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 9. Mai 2007, 11:02

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

Beitragvon würzie » Mittwoch 9. Mai 2007, 11:13

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: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 9. Mai 2007, 12:03

DAS Python-Standard-Tutorial
BlackJack

Beitragvon BlackJack » Mittwoch 9. Mai 2007, 13:19

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()

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder