Seite 1 von 1

isnumeric

Verfasst: Samstag 4. Dezember 2010, 14:13
von ihPyP
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()

Re: isnumeric

Verfasst: Samstag 4. Dezember 2010, 14:27
von ms4py
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        

Re: isnumeric

Verfasst: Samstag 4. Dezember 2010, 14:30
von nomnom
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.

Re: isnumeric

Verfasst: Samstag 4. Dezember 2010, 14:33
von 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.

Re: isnumeric

Verfasst: Samstag 4. Dezember 2010, 15:13
von gkuhl
@ihPyP: Schau dir mal "numpy.genfromtxt" an. Dann ist das ein Einzeiler.

Grüße
Gerrit

Re: isnumeric

Verfasst: Samstag 4. Dezember 2010, 16:00
von ravenheart
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)