txt - Cómo iterar sobre el archivo en python
gestion de archivos en python (5)
Deberías aprender sobre 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:]))
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.
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
El rastreo indica que probablemente tenga una línea vacía al final del archivo. Puedes arreglarlo 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 otro lado, sería mejor usar for x in f
lugar de readline
. No olvide cerrar sus archivos o utilizarlos para cerrarlos por 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)
Esto probablemente se deba a una línea vacía 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
Solo use for x in f: ...
, esto le da línea tras línea, es mucho más corto y legible (en parte porque se detiene automáticamente cuando termina el archivo) y también le ahorra la llamada de rstrip
porque la línea nueva final ya está cortada.
El error se debe a la condición de salida, que nunca puede ser cierta: incluso si el archivo está agotado, readline
devolverá una cadena vacía, no None
. También tenga en cuenta que todavía podría tener problemas con las líneas vacías, por ejemplo, al final del archivo. Agregar if line.strip() == "": continue
hace que el código ignore las líneas en blanco, lo que probablemente sea bueno de todos modos.
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))