2017-10-10 2 views
0

Ich habe versucht, einige Daten aus einer Excel-Datei zu laden und überprüfen, ob einige Werte ganze Zahlen sind. Ich bin jedoch nicht erfolgreich und die IsInt-Methode löst keine Ausnahmen aus. Warum?Ausnahme macht keine Ausnahme für DataFrame Python

In der Excel-Datei kann eine Ganzzahl auch als 5,00 gespeichert werden.

class Load; 
    def __init__(self, path="data.xls"): 
     self.data = pd.read_excel(path, header=1, sheetname=0) 
     self.diction = self.data.to_dict(orient='index') 

    def IsInt(self, i, j): 
     try: 
      num = int(self.data.iat[i,j]) 
     except ValueError: 
      print('error') 

load = Load() 
load.IsInt(0, 0) 
+0

Warum nicht 'isinstance (self.data.iat [i, j], int)' 'verwenden? Wenn 'self.data.iat [i, j]' ist ein Doppel (zum Beispiel 3,14) wird es keine Ausnahme werfen und num wird 3. –

+0

@ArthurGouveia, Es hilft nicht und es ist immer noch in der ersten Verzweigung und daher wird der Fehler nicht gedruckt. Zur Klarstellung: Ich habe eine Excel-Datei, wo auf einige Punkte SIND ganze Zahlen (Anzahl von einigen Entitäten) und wenn die Eingabe falsch ist, möchte ich eine Fehlermeldung schreiben. – albert

+0

Jeder float kann in einen int konvertiert werden, ohne einen Fehler auszulösen. –

Antwort

0

In Python haben, tut num = int(1.6) nicht Ursache ein Fehler. Es setzt num auf 1, indem der Bruchteil abgeschnitten wird.

Um zu überprüfen, ob eine Zahl wirklich eine ganze Zahl ist, tun Sie etwas wie if x == int(x): .... Sie sollten immer noch die TypeError fangen, falls x keine Nummer ist.

Hier ist, wie Sie diese anwenden könnten:

def IsInt(self, i, j): 
    try: 
     num=self.data.iat[i, j] 
     if num != int(num): 
      raise ValueError() 
    except TypeError, ValueError: 
     print('error') 

Dieser Fehler für String-Zellen und Zellen mit Float-Werten wie 3,14 gedruckt werden. Es erlaubt Zellen mit tatsächlichen Ints und Zellen mit Floats ohne Bruchteil, wie 5.0.

Schritt für Schritt Aufschlüsselung:

  1. int(num) werden alle Arten entfernen, die durch Anheben eines TypeError keine Strings oder Zahlen aus der Betrachtung sind. Es werden auch Zeichenfolgen entfernt, die keine Ganzzahlen mit einer ValueError darstellen.

  2. num != int(num) eliminiert alle Integer-Strings und numerischen Typen, die gebrochene Teile enthalten. Um die gleiche Antwort wie in # 1 auszulösen, fertigen wir unsere eigenen ValueError.

  3. Die einzige verbleibende Typen, die numerischen Typen sind keine Fehler auslösen (int, float, Fraction, etc.), die nicht einen Bruchteil aufweisen.

+0

Sie müssen keine Ausnahme auslösen und in der nächsten Zeile fangen ... –

+0

@Arthur.Ich benutze die Tatsache, dass ich bereits einen try catch-Block habe, um Code-Duplikation zu vermeiden. Dies ist ein einigermaßen gebräuchlicher Algorithmus –

+0

@ArthurGouveia. Es ist auch viel besser, in diesem Fall die Eingabe von Enten zu verwenden, weil Sie wirklich nicht sicher sein können, welcher Typ von 'num' im Vordergrund steht. Es könnte 'str',' date', 'float',' int' usw. sein. Meine Methode filtert automatisch alles heraus, was sich nicht wie eine Zahl verhält. –

-1

Sie können dies versuchen:

class Load; 
    def __init__(self, path="data.xls"): 
     self.data = pd.read_excel(path, header=1, sheetname=0) 
     self.diction = self.data.to_dict(orient='index') 

    def IsInt(self, i, j): 
     if isinstance(self.data.iat[i,j], int) 
      num=self.data.iat[i,j] 
     else: 
      print('error') 

Da num nicht verwendet wird innerhalb oder außerhalb IsInt können Sie eine sauberere Version von IsInt

def IsInt(self, i, j): 
    if not isinstance(self.data.iat[i, j], int): 
     print('error') 
+0

Ja, ich habe es wirklich versucht, es mit try/except zu versuchen, aber das ist sehr akzeptabel. Vielen Dank! Allerdings habe ich es leicht geändert, daher kann die Ganzzahleingabe in einer Form von 5.000 sein (zum Beispiel) 'falls nicht (self.data.iat [i, j]% 1 == 0.0):' – albert

+0

Dies geht nicht durch ganzzahlige Gleitkommazahlen –