2011-04-20 16 views
27

Tengo un archivo de texto con algunos números hexadecimales y estoy tratando de convertirlo a decimal. Pude convertirlo con éxito, pero parece que antes de que exista el bucle lee algún carácter no deseado y me aparece el siguiente error.Cómo iterar sobre el archivo en python

Traceback (most recent call last): 
    File "convert.py", line 7, in <module> 
    print >>g, int(x.rstrip(),16) 
ValueError: invalid literal for int() with base 16: '' 

Mi código es el siguiente

f=open('test.txt','r') 
g=open('test1.txt','w') 
#for line in enumerate(f): 
while True: 
    x=f.readline() 
    if x is None: break 
    print >>g, int(x.rstrip(),16) 

Cada número hexadecimal viene en una nueva línea para la entrada

+0

Bueno, tomar el depurador y averiguar cuál es el valor de 'x' es la causa del problema. Tal vez tienes un archivo con una lista de materiales? –

+0

@RestRisiko: Si hubiera una lista de materiales, el mensaje de error mostraría eso. No, simplemente intentó alimentar la cadena vacía '''' a 'int'. – delnan

Respuesta

49

El rastreo indica que probablemente tiene una línea vacía al final del archivo. se puede arreglar así:

f = open('test.txt','r') 
g = open('test1.txt','w') 
while True: 
    x = f.readline() 
    x = x.rstrip() 
    if not x: break 
    print >> g, int(x, 16) 

Por otra parte, sería mejor utilizar for x in f en lugar de readline. No se olvide de cerrar los archivos o mejores a utilizar with que les cierra para usted:

with open('test.txt','r') as f: 
    with open('test1.txt','w') as g: 
     for x in f: 
      x = x.rstrip() 
      if not x: continue 
      print >> g, int(x, 16) 
+12

La indentación-pesadez de este último se puede reducir en versiones más recientes: 'con open ('test.txt', 'r') como f, abierto ('test1. txt ',' w ') como g' – delnan

+4

@delnan, ¡Nueva y bonita cosa! Cuando la sangría no es un problema, prefiero la forma de dos líneas. Lo leí mejor ... – joaquin

+1

¡Uy! ¿por qué el voto abajo? Los votos abajo no son útiles sin una explicación, especialmente cuando el OP ya aceptó la respuesta. – joaquin

12

sólo tiene que utilizar for x in f: ..., esto da que la línea tras línea, es mucho más corto y fácil de leer (en parte porque se detiene automáticamente cuando finaliza el archivo) y también le ahorra la llamada rstrip porque la nueva línea final ya está cortada.

El error es causado por la condición de salida, que nunca puede ser verdadera: incluso si el archivo está agotado, readline devolverá una cadena vacía, no None. También tenga en cuenta que aún podría tener problemas con las líneas vacías, p. al final del archivo. Agregar if line.strip() == "": continue hace que el código ignore las líneas en blanco, lo que es muy bueno.

+0

Esto NO tira de las líneas nuevas posteriores: 'python -c 'con open (" file.txt ") como f: print (repr ([l [-1] para l en f]))' 'devuelve muchas instancias de' \ n' en Python 2.7.12 y 3.4.5 – JamesTheAwesomeDude

1

Esto es probablemente debido a una línea en blanco al final de su archivo de entrada.

Prueba esto:

for x in f: 
    try: 
     print int(x.strip(),16) 
    except ValueError: 
     print "Invalid input:", x 
1

Usted debe aprender acerca de EAFP vs LBYL.

from sys import stdin, stdout 
def main(infile=stdin, outfile=stdout): 
    if isinstance(infile, basestring): 
     infile=open(infile,'r') 
    if isinstance(outfile, basestring): 
     outfile=open(outfile,'w') 
    for lineno, line in enumerate(infile, 1): 
     line = line.strip() 
     try: 
      print >>outfile, int(line,16) 
     except ValueError: 
      return "Bad value at line %i: %r" % (lineno, line) 

if __name__ == "__main__": 
    from sys import argv, exit 
    exit(main(*argv[1:])) 
+0

Usaría lineno + 1 –

5
with open('test.txt', 'r') as inf, open('test1.txt', 'w') as outf: 
    for line in inf: 
     line = line.strip() 
     if line: 
      try: 
       outf.write(int(line, 16)) 
       outf.write('\n') 
      except ValueError: 
       print("Could not parse '{0}'".format(line)) 
+0

Hugh - does outf.write (int (línea, 16)) ¿funciona para usted? Mi código es exactamente igual que el tuyo, excepto que estoy tratando de escribir un diccionario d. Obtengo un ValueError. Ver a continuación: Traza (última llamada más reciente): Archivo "./test.py", línea 22, en outf.write (d) ValueError: operación de E/S en archivo cerrado – blehman

Cuestiones relacionadas