2009-12-03 10 views
124

Ich erstelle ein Programm, das eine Datei liest und wenn die erste Zeile der Datei nicht leer ist, liest es die nächsten vier Zeilen. Berechnungen werden für diese Zeilen ausgeführt und dann wird die nächste Zeile gelesen. Wenn diese Zeile nicht leer ist, wird sie fortgesetzt. Allerdings erhalte ich diesen Fehler:ValueError: ungültiges Literal für int() mit Basis 10: ''

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

Es liest die erste Zeile, kann aber nicht in eine ganze Zahl 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()) 
+0

Sie sollten 'mit open (file_to_read, 'r') als infile:' dort betrachten. – Omnifarious

Antwort

41

Pythonic Art und Weise über eine Datei von iterieren und in int konvertieren:

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 komplizierter ist etwas zu tun, aber immer noch nicht gerad- vorwärts:

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

So verarbeitet es 5 Zeilen zu der Zeit. Verwenden Sie h.next() anstelle von next(h) vor Python 2.6.

Der Grund, warum Sie hatten ValueError ist, weil int kann nicht konvertieren eine leere Zeichenfolge in die ganze Zahl. In diesem Fall müssen Sie entweder den Inhalt der Zeichenfolge vor der Konvertierung überprüfen oder außer einem Fehler:

try: 
    int('') 
except ValueError: 
    pass  # or whatever 
+4

Ihr try/except unterscheidet nicht zwischen etwas vernünftig Erwarteten (leere/leere Zeile) und etwas Schrecklichem wie einem Nicht-Integer. –

+0

und warum möchten Sie diese Dinge unterscheiden? – SilentGhost

+2

weil man vernünftigerweise zu erwarten und zu ignorieren ist, aber der andere ist ein Hinweis auf einen Fehler –

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

Es mit diesem Code ein Problem. readings ist eine neue Zeile aus der Datei gelesen - 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 es ist in der Tat eins. Zum Beispiel werden leere Zeilen hier Fehler erzeugen (wie Sie sicher herausgefunden haben).

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

0

I am creating a program that reads a file and if the first line of the file is not blank, it reads the next four lines. Calculations are performed on those lines and then the next line is read.

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 
3

Sie haben ein Problem mit dieser Linie bekommen:

while file_to_read != " ": 

Dies gilt nicht eine leere Zeichenfolge finden. Es findet eine Zeichenfolge bestehend aus einem Leerzeichen. Vermutlich ist das nicht das, wonach Sie suchen.

Hören Sie auf den Rat anderer. Dies ist kein sehr idiomatischer Python-Code und würde viel klarer sein, wenn Sie direkt über die Datei iterieren, aber ich denke, dass dieses Problem ebenfalls bemerkenswert ist.

155

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' 

mich hierher gelangt sind ...

>>> float('55063.000000') 
55063.0 

verwendet werden!

+44

Ich füge einfach hinzu, um zukünftigen Lesern mehr Klarheit zu verschaffen, dass int (float ('1.0')) tatsächlich funktioniert, wenn int ('1.0') den ValueError auslöst. – katyhuff

+3

Dies sollte die beste Antwort auf diese Frage sein. Ich habe die Seite fast geschlossen und habe es nicht gesehen. Vielen Dank! – iTurki

+1

hinzufügen zu beantworten int (float ('55063.000000')) als Frage wird get int(). Dann wird es wirklich die beste Antwort geben – Max

1

Ich bekam ähnliche Fehler, stellt sich heraus, dass das Dataset leere Werte hatte, die Python nicht in Ganzzahl konvertieren konnte.

+3

Könntest du ein bisschen mehr mit einigen Beispielen erklären, wie das OP es lösen könnte? – fmendez

4

Bitte testen Sie diese Funktion (split()) in einer einfachen Datei. Ich hatte das gleiche Problem und fand, dass es war, weil split() nicht richtig geschrieben wurde (Ausnahmebehandlung).

6

Grund ist, dass Sie eine leere Zeichenfolge oder eine Zeichenfolge als Argument in int bekommen, überprüfen Sie es vor es ist leer oder es enthält alphanumerische Zeichen oder nicht, wenn es enthält, ignorieren Sie einfach diesen Teil.

+0

Das sieht eher wie ein Kommentar aus. Wenn Sie genügend Reputation haben, können Sie jeden Post kommentieren. –

+0

Ok Reputation ... !!! –

0

Dies kann auch passieren, wenn Sie durch Leerzeichen getrennte Ganzzahlen einer Liste zuordnen müssen, aber Sie die Ganzzahlen Zeile für Zeile mit der .input() eingeben. Wie zum Beispiel war ich die Lösung dieses Problems auf HackerRank Bon-Appetit und die folgende Fehlermeldung bekam beim Kompilieren enter image description here

Statt Eingabe für Zeile der Programmzeile geben versuchen, den Raum getrennt ganze Zahlen in eine Liste zur Karte mit der map() Methode.

6

Nachfolgend sind völlig akzeptabel in Python:

  • Hindurchleiten eines String-Darstellung einer ganzen Zahl in int
  • eine String-Darstellung eines Schwimmers Übergang in float
  • eine String-Darstellung einer ganzen Zahl Übergang in float
  • übergibt einen float in int
  • übergeben integer in float

Aber Sie ValueError erhalten, wenn Sie eine String-Darstellung eines float in int passieren - wie @katyhuff oben weist darauf hin, müssen Sie zunächst mit einem Schwimmer umwandeln kann, dann auf eine ganze Zahl:

>>> 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 
Verwandte Themen