ValueError: literal no válido para int () con base 10: ''


333

Estoy creando un programa que lee un archivo y si la primera línea del archivo no está en blanco, lee las siguientes cuatro líneas. Los cálculos se realizan en esas líneas y luego se lee la siguiente línea. Si esa línea no está vacía, continúa. Sin embargo, recibo este error:

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

Está leyendo la primera línea pero no puede convertirla en un número entero.

¿Qué puedo hacer para solucionar este problema?

El código:

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
Deberías considerar usar with open(file_to_read, 'r') as infile:allí.
Omnifarioso

Respuestas:


313

Para que conste:

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

Me tienes aquí ...

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

Tiene que ser usado!


101
Solo agregaré, para proporcionar más claridad para futuros lectores, que de hecho, int (float ('1.0')) funciona cuando int ('1.0') arroja el ValueError.
katyhuff

55
Esta debería ser la respuesta superior aceptada a esta pregunta. Casi cerré la página y no la vi. ¡Gracias!
iTurki

2
agregue para responder int (float ('55063.000000')) ya que la pregunta es get int (). De lo que realmente será la mejor respuesta
Max

¿Por qué pasó esto? @katyhuff
Muhamed Huseinbašić

77
Esta respuesta no parece tener nada que ver con la pregunta. La pregunta es cómo se puede prevenir un ValueError cuando se llama int()en una cadena vacía. "Usar float () en su lugar" no resuelve ese problema. Aún obtienes un ValueError.
Kevin

74

Los siguientes son totalmente aceptables en python:

  • pasando una representación de cadena de un entero en int
  • pasando una representación de cadena de un flotador en float
  • pasando una representación de cadena de un entero en float
  • pasando un flotador en int
  • pasando un número entero a float

Pero se obtiene una ValueErrorsi pasa una representación de cadena de un flotador en int, o una representación de cadena de cualquier cosa menos un entero (incluyendo cadena vacía). Si desea pasar una representación de cadena de un flotante a un int, como @katyhuff señala arriba, puede convertir primero a un flotante, luego a un entero:

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

77
Esta respuesta no parece tener nada que ver con la pregunta. La pregunta es cómo se puede prevenir un ValueError cuando se llama int()en una cadena vacía. "Usar float () en su lugar" no resuelve ese problema. Aún obtienes un ValueError.
Kevin

3
@Kevin Aunque esto no responde directamente a la pregunta del OP. Sin embargo, ayuda a las personas que tienen este problema y no les importa int(float(x)). Como esta es la primera pregunta que aparece al buscar este error.
Kerwin Sneijders

57

Forma pitónica de iterar sobre un archivo y convertir a int:

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

Lo que estás tratando de hacer es un poco más complicado, pero aún no es sencillo:

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

De esta manera procesa 5 líneas a la vez. Usar en h.next()lugar denext(h) antes de Python 2.6.

La razón que tenía ValueErrores porque intno puede convertir una cadena vacía al entero. En este caso, deberá verificar el contenido de la cadena antes de la conversión o, salvo un error:

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

44
Su intento / excepción no distingue entre algo razonablemente esperado (línea en blanco / vacío) y algo desagradable como un no entero.
John Machin el

¿Y por qué querrías distinguir esas cosas?
SilentGhost

3
porque uno es razonablemente previsible e ignorable, pero el otro es indicativo de un error
John Machin

3
¿y por qué una línea en blanco es razonablemente esperable y no es entera?
SilentGhost

1
Esto es bueno si está seguro de que su lista es en realidad una lista de enteros en cadena. Si no está seguro de poder hacerlon = int(line) if line.is_integer() else int(float(line))
Mike Furlender

23

Encontré una solución. Python convertirá el número en un flotador. Simplemente llamar a float primero y luego convertirlo a int funcionará: output = int(float(input))


11

La razón es que está obteniendo una cadena vacía o una cadena como argumento en int. Compruebe si está vacío o si contiene caracteres alfabéticos. Si contiene caracteres, simplemente ignore esa parte.


2
Esto se parece más a un comentario. Cuando tengas suficiente reputación podrás comentar cualquier publicación.
Joshua Drake

8

La razón por la que obtiene este error es porque está tratando de convertir un carácter de espacio en un entero, lo cual es totalmente imposible y restringido, y es por eso que está obteniendo este error.ingrese la descripción de la imagen aquí

Verifique su código y corríjalo, funcionará bien


8

Entonces si tienes

floatInString = '5.0'

Puedes convertirlo a intconfloatInInt = int(float(floatInString))


3

Tienes un problema con esta línea:

while file_to_read != " ":

Esto no encuentra una cadena vacía. Encuentra una cadena que consta de un espacio. Presumiblemente esto no es lo que estás buscando.

Escucha los consejos de todos los demás. Este no es un código de Python muy idiomático, y sería mucho más claro si itera sobre el archivo directamente, pero creo que también vale la pena señalar este problema.


3

Pruebe esta función ( split()) en un archivo simple. Estaba enfrentando el mismo problema y descubrí que era porque split()no estaba escrito correctamente (manejo de excepciones).


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

Hay un problema con ese código. readingses una nueva línea leída del archivo, es una cadena. Por lo tanto, no debe compararlo con 0. Además, no puede convertirlo a un entero a menos que esté seguro que es uno. Por ejemplo, las líneas vacías producirán errores aquí (como seguramente habrá descubierto).

¿Y por qué necesitas el conteo global? Eso es ciertamente un mal diseño en Python.


1

Esto también puede suceder cuando tiene que asignar números enteros separados por espacios a una lista pero ingresa los números enteros línea por línea usando .input(). Por ejemplo, estaba resolviendo este problema en HackerRank Bon-Appetit , y obtuve el siguiente error al compilar ingrese la descripción de la imagen aquí

Entonces, en lugar de dar entrada al programa línea por línea, intente mapear los enteros separados por espacios en una lista utilizando el map()método.


0

Estoy creando un programa que lee un archivo y si la primera línea del archivo no está en blanco, lee las siguientes cuatro líneas. Los cálculos se realizan en esas líneas y luego se lee la siguiente línea.

Algo como esto debería funcionar:

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

Estaba recibiendo errores similares, resulta que el conjunto de datos tenía valores en blanco que Python no podía convertir a entero.


44
¿Podría elaborar un poco más con algunos ejemplos sobre cómo el OP podría resolverlo?
fmendez

el valor en blanco significa vacío que se puede convertir en flotante de cadena. Si intenta convertir a flotador también mostrará un error
saravanan saminathan

0

Tuve el mismo problema al intentar usar readlines () dentro del bucle para el mismo objeto de archivo ... Mi sospecha es que disparar readling () dentro de readline () para el mismo objeto de archivo causó este error.

La mejor solución puede ser usar seek (0) para restablecer el puntero del archivo o manejar la condición con la configuración de algún indicador y luego crear un nuevo objeto para el mismo archivo al verificar la condición establecida ...


0

Recientemente me encontré con un caso en el que ninguna de estas respuestas funcionó. Encontré datos CSV donde había bytes nulos mezclados con los datos, y esos bytes nulos no se eliminaron. Entonces, mi cadena numérica, después de la eliminación, consistía en bytes como este:

\x00\x31\x00\x0d\x00

Para contrarrestar esto, hice:

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

... donde fields es una lista de valores csv resultantes de dividir la línea.


0

Esto parece que las lecturas son a veces una cadena vacía y obviamente aparece un error. Puede agregar una comprobación adicional a su ciclo while antes del comando int (lecturas) como:

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

0

Me costó averiguar la razón real, sucede cuando no leemos correctamente del archivo. necesita abrir el archivo y leer con el método readlines () como se muestra a continuación:

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

Corrige la salida formateada


0

su respuesta es arrojar errores debido a esta línea

readings = int(readings)
  1. Aquí está tratando de convertir una cadena en tipo int que no es base-10. puede convertir una cadena en int solo si es base 10; de lo contrario, arrojará ValueError, indicando literal no válido para int () con base 10.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.