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

Estoy creando un programa que lee un archivo y si la primera línea del archivo no está en blanco, lee las cuatro líneas siguientes. 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, estoy recibiendo este error:

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

Está leyendo la primera línea pero no puede convertirla en un 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())

Forma pitónica de iterar sobre un archivo y convertirlo 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 intentas hacer es un poco más complicado, pero todavía 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. Usa h.next() en lugar de next(h) antes de Python 2.6.

La razón por la que tienes ValueError es porque int no puede convertir una cadena vacía en un entero. En este caso necesitarías o bien comprobar el contenido de la cadena antes de la conversión, o bien exceptuar un error:

try:
   int('')
except ValueError:
   pass      # or whatever
Comentarios (5)
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

Hay un problema con ese código. Lectura" es una nueva línea leída desde el archivo - es una cadena. Por lo tanto, no debe compararla con 0. Además, no puede convertirla en un entero a menos que esté seguro de que lo es. Por ejemplo, las líneas vacías producirán errores aquí (como seguramente ha descubierto).

¿Y por qué necesita el recuento global? Eso'es ciertamente un mal diseño en Python.

Comentarios (0)

Estoy creando un programa que lee un archivo

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 se lee la siguiente línea.

Algo así 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
Comentarios (0)