ValueError: valore letterale non valido per int () con base 10: ''


333

Sto creando un programma che legge un file e se la prima riga del file non è vuota, legge le successive quattro righe. I calcoli vengono eseguiti su quelle righe e quindi viene letta la riga successiva. Se quella riga non è vuota, continua. Tuttavia, visualizzo questo errore:

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

Sta leggendo la prima riga ma non può convertirla in un numero intero.

Cosa posso fare per risolvere questo problema?

Il codice:

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())

3
Dovresti prendere in considerazione l'uso with open(file_to_read, 'r') as infile:lì.
Onnipotente il

Risposte:


313

Solo per la cronaca:

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

Mi ha portato qui ...

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

Deve essere usato!


101
Aggiungerò semplicemente, per fornire maggiore chiarezza ai futuri lettori, che in effetti int (float ('1.0')) funziona quando int ('1.0') genera ValueError.
katyhuff,

5
Questa dovrebbe essere la risposta più accettata a questa domanda. Ho quasi chiuso la pagina e non l'ho vista. Grazie!
iTurki,

2
aggiungi alla risposta int (float ('55063.000000')) poiché la domanda è get int (). Di ciò sarà davvero la risposta migliore
Max

Perché succede? @katyhuff
Muhamed Huseinbašić,

7
Questa risposta non sembra avere nulla a che fare con la domanda. La domanda è: come si potrebbe impedire un ValueError quando si chiama int()una stringa vuota. "Usa invece float ()" non risolve questo problema. Ottieni ancora un ValueError.
Kevin,

74

I seguenti sono totalmente accettabili in Python:

  • passando una rappresentazione in formato stringa di un numero intero in int
  • passando una rappresentazione di stringa di un float in float
  • passando una rappresentazione in formato stringa di un numero intero in float
  • passando un galleggiante dentro int
  • passando un numero intero in float

Ma si ottiene un ValueErrorse si passa una rappresentazione di stringa di un galleggiante in int, o una stringa che rappresenta tutt'altro che un numero intero (compresa una stringa vuota). Se vuoi passare una rappresentazione di stringa di un float a un int, come sottolineato sopra da @katyhuff, puoi prima convertirlo in un float, quindi in un numero intero:

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

7
Questa risposta non sembra avere nulla a che fare con la domanda. La domanda è: come si potrebbe impedire un ValueError quando si chiama int()una stringa vuota. "Usa invece float ()" non risolve questo problema. Ottieni ancora un ValueError.
Kevin,

3
@Kevin Anche se questo non risponde direttamente alla domanda del PO. Tuttavia, aiuta le persone che hanno questo problema e non si preoccupano int(float(x)). Poiché questa è la prima domanda che viene visualizzata quando si cerca questo errore.
Kerwin Sneijders,

57

Modo Pythonic di iterare su un file e convertirlo in int:

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

Quello che stai cercando di fare è leggermente più complicato, ma ancora non semplice:

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

In questo modo elabora 5 righe alla volta. Usa h.next()invece dinext(h) prima di Python 2.6.

Il motivo che hai avuto ValueErrorè perché intnon puoi convertire una stringa vuota nell'intero. In questo caso, dovrai verificare il contenuto della stringa prima della conversione o tranne un errore:

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

4
Il tuo tentativo / eccezione non distingue tra qualcosa di ragionevole prevedibile (riga vuota / vuota) e qualcosa di brutto come un non intero.
John Machin,

e perché vorresti distinguere quelle cose?
SilentGhost,

3
perché uno è ragionevolmente prevedibile e ignorabile, ma l'altro è indicativo di un errore
John Machin,

3
e perché una riga vuota è ragionevolmente prevedibile e non intero non lo è?
SilentGhost,

1
questo è utile se sei sicuro che la tua lista sia in realtà una lista di numeri interi stringati. Se non sei sicuro di poterlo faren = int(line) if line.is_integer() else int(float(line))
Mike Furlender,

23

Ho trovato un lavoro in giro. Python convertirà il numero in un float. Basta chiamare prima float e poi convertirlo in un int funzionerà: output = int(float(input))


11

Il motivo è che stai ottenendo una stringa vuota o una stringa come argomento in int. Controlla se è vuoto o contiene caratteri alfa. Se contiene caratteri, ignora semplicemente quella parte.


2
Sembra più un commento. Quando hai una reputazione sufficiente sarai in grado di commentare qualsiasi post.
Joshua Drake,

8

Il motivo per cui stai ricevendo questo errore è che stai provando a convertire un carattere spazio in un numero intero, il che è totalmente impossibile e limitato, ed è per questo che stai ricevendo questo errore.inserisci qui la descrizione dell'immagine

Controlla il tuo codice e correggilo, funzionerà bene


8

Quindi se hai

floatInString = '5.0'

Puoi convertirlo in intconfloatInInt = int(float(floatInString))


3

Hai un problema con questa linea:

while file_to_read != " ":

Questo non trova una stringa vuota. Trova una stringa composta da uno spazio. Presumibilmente questo non è quello che stai cercando.

Ascolta i consigli di tutti gli altri. Questo non è un codice python molto idiomatico, e sarebbe molto più chiaro se si scorre il file direttamente, ma penso che anche questo problema meriti di essere notato.


3

Si prega di testare questa funzione ( split()) su un semplice file. Stavo affrontando lo stesso problema e ho scoperto che era perché split()non era stato scritto correttamente (gestione delle eccezioni).


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

C'è un problema con quel codice. readingsè una nuova riga letta dal file - è una stringa. Pertanto non dovresti confrontarlo con 0. Inoltre, non puoi semplicemente convertirlo in un numero intero se non sei sicuro che sia effettivamente uno. Ad esempio, le righe vuote produrranno errori qui (come sicuramente hai scoperto).

E perché hai bisogno del conteggio globale? Questo è sicuramente un cattivo design in Python.


1

Ciò può accadere anche quando è necessario mappare numeri interi separati da spazio a un elenco ma si immettono i numeri riga per riga utilizzando il .input(). Come ad esempio stavo risolvendo questo problema su HackerRank Bon-Appetit e durante la compilazione ho ottenuto il seguente errore inserisci qui la descrizione dell'immagine

Quindi, invece di fornire input al programma riga per riga, prova a mappare gli interi separati da spazio in un elenco usando il map()metodo.


0

Sto creando un programma che legge un file e se la prima riga del file non è vuota, legge le successive quattro righe. I calcoli vengono eseguiti su quelle righe e quindi viene letta la riga successiva.

Qualcosa del genere dovrebbe funzionare:

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

0

Stavo ottenendo errori simili, si scopre che il set di dati aveva valori vuoti che Python non poteva convertire in numeri interi.


4
Potresti approfondire un po 'di più con alcuni esempi su come l'OP potrebbe risolverlo?
fmendez,

valore vuoto significa vuoto che può essere convertito in stringa float. Se provi a convertire in float mostrerà anche un errore
saravanan saminathan

0

Mi sono imbattuto nello stesso problema quando ho provato a usare readlines () all'interno per loop per lo stesso oggetto file ... Il mio sospetto è che il readling () all'interno di readline () per lo stesso oggetto file abbia causato questo errore.

La soluzione migliore può essere utilizzare seek (0) per ripristinare il puntatore del file o Gestire la condizione con l'impostazione di un flag, quindi creare un nuovo oggetto per lo stesso file controllando la condizione impostata ....


0

Di recente mi sono imbattuto in un caso in cui nessuna di queste risposte ha funzionato. Ho riscontrato dati CSV in cui vi erano byte nulli mescolati con i dati e quei byte nulli non venivano rimossi. Quindi, la mia stringa numerica, dopo lo stripping, consisteva in byte come questo:

\x00\x31\x00\x0d\x00

Per contrastare questo, ho fatto:

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

... dove i campi è un elenco di valori CSV risultanti dalla divisione della linea.


0

Sembra che le letture siano a volte una stringa vuota e ovviamente si verifica un errore. Puoi aggiungere un controllo extra al tuo ciclo while prima del comando int (letture) come:

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

0

Ho avuto difficoltà a capire il vero motivo, succede quando non leggiamo correttamente dal file. devi aprire il file e leggere con il metodo readlines () come di seguito:

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

Corregge l'output formattato


0

la tua risposta sta generando errori a causa di questa linea

readings = int(readings)
  1. Qui stai provando a convertire una stringa in tipo int che non è base-10. puoi convertire una stringa in int solo se è base-10, altrimenti genererà ValueError, dichiarando letterale non valido per int () con base 10.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.