isnumeric

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
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

Hallo,

kann mir bitte jemand weiterhelfen. Ich lese aus einer Textdatei mehrere Zeilen ein.
Die Zeilen bestehen in der Regel aus Zahlenkolonnen, wie folgende Beispiel zeigt:

Code: Alles auswählen

0.000001   0.00002    0.0003
Am Anfang der Datei stehen aber einige Zeilen, welche den Aufbau der Datei beschreiben. Mit anderen Worten dort steht Text!
Ich wollte nun mit der Methode "isNumeric" prüfen, ob es sich um eine Textzeile handelt, welche rein aus Zahlen besteht. Wenn ja, konvertiere ich die Daten in Fließkommazahlen; andernfalls wird die Zeile ignoriert. Nun meine Frage:
Wie verwendet man die Funktion isNumeric? Ich werde aus dem Beispiel im Manual nicht schlau und erhalte dauernd Fehlermeldungen: Hier mein Code-Ausschnitt:

Code: Alles auswählen

import math
import io
import string

def ReadDataFromFile(Path, Filename1, Container, TranslationX, TranslationR):
    #
    pFilename = str(Path + "\\" + Filename1)
    #
    with open(pFilename, "r") as inpfile:
        i = 0
        for line in inpfile:
            print "Zeile: (", line, ")", line.isNumeric()
            line = line.strip()
            words = line.split( )
            i = i + 1
            #
            if (line.isnumeric() == True):
                Container.X.append(float(words[0]))
                Container.X[i] = Hub.X[i] + TranslationX
                #
                Container.R.append(float(words[1]))
                Container.R[i] = Hub.R[i] + TranslationR
                #
                if (i == 0):
                    Container.M.append(0.0)
                else:
                    dx = (Container.X[i] - Container.X[i-1])
                    dr = (Container.R[i] - Container.R[i-1])
                    dm = math.sqrt(pow(dx, 2) + pow(dr, 2))
                    Container.M.append(Container.M[i] + dm)
            #
        Container.IMax = i
        #
    inpfile.close()
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Eine etwas primitive Lösung, der reg. Ausdruck lässt sich aber natürlich auch optimieren.

Code: Alles auswählen

import re

lines = ['0.0001 0.002 0.0004', 'bla blub abc', '13  81 234', 'xyz']

pattern = re.compile('[a-z]')

for line in lines:
    if not pattern.search(line):
        print line        
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Es gibt kein `.isNumeric()`. Guckst du `.isnumeric()`? Schau dir mal PEP8 an. Und `.isnumeric()` brauch ein Unicode-Objekt. Und die Fehlermeldung zu posten wäre sehr hilfreich.
BlackJack

@ihPyP: Du musst einfach die Zeile umwandeln -- wenn dabei eine Ausnahme auftritt weil ein Element nicht umgewandelt werden konnte, dann geht's halt nicht, und diese Zeile musst Du ignorieren.

Zeichenketten haben weder eine `isnumeric()`- noch eine `isNumeric()`-Methode. Du müsstest da also sowieso einen `NameError` zur Laufzeit bekommen.

Der Quelltext ist übrigens nicht besonders "pythonisch". Die Namensgebung folgt nicht dem Style-Guide. Typpräfixe sind äusserst unüblich. Klammern um Bedingungen sind überflüssig, wenn sie nicht den Operatorvorrang betreffen. Und explizite Vergleiche auf ``==`` oder ``!=`` mit `True` oder `False` sind schlechter Stil. Die Bedingung selbst ergibt ja schon einen Wahrheitswert. Den noch einmal mit einem literalen Wahrheitswert zu vergleichen macht keinen Sinn.

Das manuelle Hochzählen von `i` sowie die ganzen Indexzugriffe sind unschön -- da sollte man schauen, dass man die beseitigt bekommt. Zumindest auf das `i` sollte man verzichten können. Falls nicht, gibt es `enumerate()`.

`Hub` kommt "aus dem Nichts" -- das sollte als Argument übergeben werden.

`Container.IMax` ist redundant -- die Listen kennen ihre eigene Länge. Der `Container`-Typ sollte besser eine `__len__()`-Implementierung bekommen, die darauf zurückgreift. Ausserdem scheinen mir da zusammengehörige Daten in parallel geführten Listen verwaltet zu werden. Das ist in der Regel ein "code smell". Daten die zusammen eine Einheit bilden, sollten auch in *einem* Objekt gespeichert werden.

Wenn Du ``with`` verwendest, brauchst Du die Datei nicht mehr selber zu schliessen.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@ihPyP: Schau dir mal "numpy.genfromtxt" an. Dann ist das ein Einzeiler.

Grüße
Gerrit
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Di könntest auch die Zeilen splitten und mit dem regulären AUsdruck

Code: Alles auswählen

 "^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$"
schaun, ob das Zahlen sind (Exponentialdarstellung inklusive)
Antworten