ValueError: ungültiges Literal für int () mit Basis 10: ''

332

Ich erstelle ein Programm, das eine Datei liest, und wenn die erste Zeile der Datei nicht leer ist, liest sie die nächsten vier Zeilen. In diesen Zeilen werden Berechnungen durchgeführt und dann die nächste Zeile gelesen. Wenn diese Zeile nicht leer ist, wird sie fortgesetzt. Ich erhalte jedoch folgende Fehlermeldung:

ValueError: invalid literal for int() with base 10: ''.

Es liest die erste Zeile, kann sie jedoch nicht in eine Ganzzahl konvertieren.

Was kann ich tun, um dieses Problem zu beheben?

Der Code:

file_to_read = raw_input("Enter file name of tests (empty string to end program):")
try:
    infile = open(file_to_read, 'r')
    while file_to_read != " ":
        file_to_write = raw_input("Enter output file name (.csv will be appended to it):")
        file_to_write = file_to_write + ".csv"
        outfile = open(file_to_write, "w")
        readings = (infile.readline())
        print readings
        while readings != 0:
            global count
            readings = int(readings)
            minimum = (infile.readline())
            maximum = (infile.readline())
Sarah Cox
quelle
3
Sie sollten in Betracht ziehen, with open(file_to_read, 'r') as infile:dort zu verwenden.
Omnifarious

Antworten:

310

Nur für das Protokoll:

>>> int('55063.000000')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'

Habe mich hierher gebracht ...

>>> int(float('55063.000000'))
55063.0

Muss benutzt werden!

FdoBad
quelle
101
Ich werde nur hinzufügen, um zukünftigen Lesern mehr Klarheit zu bieten, dass int (float ('1.0')) tatsächlich funktioniert, wenn int ('1.0') den ValueError auslöst.
Katyhuff
5
Dies sollte die akzeptierte Top-Antwort auf diese Frage sein. Ich habe die Seite fast geschlossen und nicht gesehen. Vielen Dank!
iTurki
2
addiere, um int (float ('55063.000000')) zu beantworten, da die Frage get int () ist. Dann wird es wirklich die beste Antwort sein
Max
Warum passiert das? @katyhuff
Muhamed Huseinbašić
7
Diese Antwort scheint nichts mit der Frage zu tun zu haben. Die Frage ist, wie man einen ValueError verhindern kann, wenn man int()eine leere Zeichenfolge aufruft . "Verwenden Sie stattdessen float ()" löst dieses Problem nicht. Sie erhalten weiterhin einen ValueError.
Kevin
73

Folgendes ist in Python völlig akzeptabel:

  • Übergeben einer Zeichenfolgendarstellung einer Ganzzahl an int
  • Übergeben einer Zeichenfolgendarstellung eines Floats in float
  • Übergeben einer Zeichenfolgendarstellung einer Ganzzahl an float
  • einen Schwimmer passieren int
  • Übergabe einer Ganzzahl in float

Aber Sie bekommen ein , ValueErrorwenn Sie eine String - Darstellung eines passieren Schwimmer in intoder eine String - Darstellung von irgendetwas , sondern eine ganze Zahl (einschließlich leerer String). Wenn Sie eine Zeichenfolgendarstellung eines intGleitkommas an ein übergeben möchten, wie @katyhuff oben ausführt, können Sie zuerst in ein Gleitkommawert und dann in eine Ganzzahl konvertieren:

>>> int('5')
5
>>> float('5.0')
5.0
>>> float('5')
5.0
>>> int(5.0)
5
>>> float(5)
5.0
>>> int('5.0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(float('5.0'))
5
Peter
quelle
7
Diese Antwort scheint nichts mit der Frage zu tun zu haben. Die Frage ist, wie man einen ValueError verhindern kann, wenn man int()eine leere Zeichenfolge aufruft . "Verwenden Sie stattdessen float ()" löst dieses Problem nicht. Sie erhalten weiterhin einen ValueError.
Kevin
3
@ Kevin Auch wenn dies die Frage des OP nicht direkt beantwortet. Es hilft jedoch Menschen, die dieses Problem haben und sich nicht darum kümmern int(float(x)). Dies ist die erste Frage, die bei der Suche nach diesem Fehler auftaucht.
Kerwin Sneijders
57

Pythonische Methode zum Durchlaufen einer Datei und zum Konvertieren in int:

for line in open(fname):
   if line.strip():           # line contains eol character(s)
       n = int(line)          # assuming single integer on each line

Was Sie versuchen, ist etwas komplizierter, aber immer noch nicht einfach:

h = open(fname)
for line in h:
    if line.strip():
        [int(next(h).strip()) for _ in range(4)]     # list of integers

Auf diese Weise werden jeweils 5 Zeilen verarbeitet. Verwenden Sie h.next()anstelle von next(h)vor Python 2.6.

Der Grund , warum Sie hatte ValueError, weil intnicht eine leere Zeichenfolge in die ganze Zahl konvertieren. In diesem Fall müssen Sie entweder den Inhalt der Zeichenfolge vor der Konvertierung überprüfen oder einen Fehler ausschließen:

try:
   int('')
except ValueError:
   pass      # or whatever
SilentGhost
quelle
4
Ihr Versuch / Ihre Ausnahme unterscheidet nicht zwischen etwas Vernünftigem (Leerzeichen / Leerzeile) und etwas Bösem wie einer Nicht-Ganzzahl.
John Machin
und warum sollten Sie diese Dinge unterscheiden wollen?
SilentGhost
3
weil einer vernünftigerweise zu erwarten und zu ignorieren ist, der andere jedoch auf einen Fehler hinweist
John Machin
3
und warum ist eine leere Zeile vernünftigerweise zu erwarten und eine nicht ganzzahlige nicht?
SilentGhost
1
Dies ist gut, wenn Sie sicher sind, dass Ihre Liste tatsächlich eine Liste von Ganzzahlen mit Zeichenfolgen ist. Wenn Sie nicht sicher sind, können Sien = int(line) if line.is_integer() else int(float(line))
Mike Furlender
23

Ich habe eine Arbeit gefunden. Python konvertiert die Zahl in ein Float. Einfach float zuerst aufrufen und dann in ein int konvertieren, funktioniert: output = int(float(input))

Brad123
quelle
11

Der Grund ist, dass Sie eine leere Zeichenfolge oder eine Zeichenfolge als Argument in int erhalten. Überprüfen Sie, ob es leer ist oder Alpha-Zeichen enthält. Wenn es Zeichen enthält, ignorieren Sie diesen Teil einfach.

Rajender Kumar
quelle
2
Das sieht eher nach einem Kommentar aus. Wenn Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren.
Joshua Drake
8

Der Grund, warum Sie diesen Fehler erhalten, ist, dass Sie versuchen, ein Leerzeichen in eine Ganzzahl umzuwandeln, was völlig unmöglich und eingeschränkt ist. Und deshalb erhalten Sie diesen Fehler.Geben Sie hier die Bildbeschreibung ein

Überprüfen Sie Ihren Code und korrigieren Sie ihn, es wird gut funktionieren

Joish
quelle
8

Also wenn du hast

floatInString = '5.0'

Sie können es in intmit konvertierenfloatInInt = int(float(floatInString))

Harvey
quelle
3

Sie haben ein Problem mit dieser Zeile:

while file_to_read != " ":

Dies findet keine leere Zeichenfolge. Es wird eine Zeichenfolge gefunden, die aus einem Leerzeichen besteht. Vermutlich ist dies nicht das, wonach Sie suchen.

Hören Sie auf die Ratschläge aller anderen. Dies ist kein sehr idiomatischer Python-Code und wäre viel klarer, wenn Sie die Datei direkt durchlaufen, aber ich denke, dieses Problem ist ebenfalls erwähnenswert.

jcdyer
quelle
3

Bitte testen Sie diese Funktion ( split()) an einer einfachen Datei. Ich hatte das gleiche Problem und stellte fest, dass es daran split()lag , dass es nicht richtig geschrieben wurde (Ausnahmebehandlung).

Elixenid
quelle
1
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

Es gibt ein Problem mit diesem Code. readingsist eine neue Zeile, die aus der Datei gelesen wird - es ist eine Zeichenfolge. Daher sollten Sie es nicht mit 0 vergleichen. Außerdem können Sie es nicht einfach in eine Ganzzahl konvertieren, es sei denn, Sie sind sicher , dass es tatsächlich eine ist. Beispielsweise führen leere Zeilen hier zu Fehlern (wie Sie sicherlich herausgefunden haben).

Und warum brauchen Sie die globale Zählung? Das ist mit Sicherheit schlechtes Design in Python.

Eli Bendersky
quelle
1

Dies kann auch passieren, wenn Sie einer Liste durch Leerzeichen getrennte Ganzzahlen zuordnen müssen, die Ganzzahlen jedoch Zeile für Zeile mit der eingeben .input(). Wie zum Beispiel habe ich dieses Problem auf HackerRank Bon-Appetit gelöst und beim Kompilieren den folgenden Fehler erhalten Geben Sie hier die Bildbeschreibung ein

Versuchen Sie also, anstatt durch eine zeilenweise Eingabe in das Programm die durch Leerzeichen getrennten Ganzzahlen mithilfe der map()Methode in eine Liste abzubilden .

Amit Kumar
quelle
0

Ich erstelle ein Programm, das eine Datei liest, und wenn die erste Zeile der Datei nicht leer ist, liest sie die nächsten vier Zeilen. In diesen Zeilen werden Berechnungen durchgeführt und dann die nächste Zeile gelesen.

So etwas sollte funktionieren:

for line in infile:
    next_lines = []
    if line.strip():
        for i in xrange(4):
            try:
                next_lines.append(infile.next())
            except StopIteration:
                break
    # Do your calculation with "4 lines" here
Imran
quelle
0

Ich habe ähnliche Fehler erhalten, es stellte sich heraus, dass der Datensatz leere Werte hatte, die Python nicht in eine Ganzzahl konvertieren konnte.

user2162611
quelle
4
Könnten Sie mit einigen Beispielen etwas näher darauf eingehen, wie das OP es lösen könnte?
Fmendez
leerer Wert bedeutet leer, der in String float konvertiert werden kann. Wenn Sie versuchen, in Float zu konvertieren, zeigt es auch Fehler
Saravanan Samanathan
0

Ich bin auf dasselbe Problem gestoßen, als ich versucht habe, readlines () in der for-Schleife für dasselbe Dateiobjekt zu verwenden ... Mein Verdacht, dass readling () in readline () für dasselbe Dateiobjekt ausgelöst wurde, hat diesen Fehler verursacht.

Die beste Lösung kann die Suche (0) sein, um den Dateizeiger zurückzusetzen oder die Bedingung mit dem Setzen eines Flags zu behandeln und dann ein neues Objekt für dieselbe Datei zu erstellen, indem die festgelegte Bedingung überprüft wird.

Abhishek Jain
quelle
0

Ich bin kürzlich auf einen Fall gestoßen, in dem keine dieser Antworten funktioniert hat. Ich bin auf CSV-Daten gestoßen, bei denen Null-Bytes mit den Daten gemischt waren und diese Null-Bytes nicht entfernt wurden. Also bestand meine numerische Zeichenfolge nach dem Entfernen aus folgenden Bytes:

\x00\x31\x00\x0d\x00

Um dem entgegenzuwirken, habe ich:

countStr = fields[3].replace('\x00', '').strip()
count = int(countStr)

... wobei Felder eine Liste von CSV-Werten sind, die sich aus der Aufteilung der Zeile ergeben.

T. Reed
quelle
0

Dies scheint, als ob Messwerte manchmal eine leere Zeichenfolge sind und offensichtlich ein Fehler auftritt. Sie können Ihrer while-Schleife vor dem Befehl int (readings) eine zusätzliche Prüfung hinzufügen, z.

while readings != 0 | readings != '':
    global count
    readings = int(readings)
Kanishk Mair
quelle
0

Es fiel mir schwer, den tatsächlichen Grund herauszufinden. Es passiert, wenn wir nicht richtig aus der Datei lesen. Sie müssen die Datei öffnen und mit der readlines () -Methode wie folgt lesen:

with open('/content/drive/pre-processed-users1.1.tsv') as f:
    file=f.readlines()

Es korrigiert die formatierte Ausgabe

Shaina Raza
quelle
0

Ihre Antwort wirft aufgrund dieser Zeile Fehler

readings = int(readings)
  1. Hier versuchen Sie, eine Zeichenfolge in einen int-Typ zu konvertieren, der nicht base-10 ist. Sie können einen String nur dann in int konvertieren, wenn er Base-10 ist. Andernfalls wird ValueError ausgelöst, wobei ein ungültiges Literal für int () mit Base 10 angegeben wird.
Shubham
quelle