51 votes

Comment itérer sur un fichier en python ?

J'ai un fichier texte avec des nombres hexadécimaux et j'essaie de le convertir en décimal. J'ai réussi à le convertir, mais il semble qu'avant que la boucle n'existe, elle lise un caractère indésirable et j'obtiens l'erreur suivante.

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

Mon code est le suivant

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)

Chaque nombre hexadécimal vient dans une nouvelle ligne pour la saisie.

78voto

joaquin Points 22450

L'historique indique que vous avez probablement une ligne vide à la fin du fichier. Vous pouvez le corriger comme suit :

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)

D'un autre côté, il serait préférable d'utiliser for x in f au lieu de readline . N'oubliez pas de fermer vos fichiers ou mieux d'utiliser with qui les ferment pour vous :

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)

14voto

Il suffit d'utiliser for x in f: ... cela vous donne une ligne après l'autre, c'est beaucoup plus court et plus lisible (en partie parce qu'il s'arrête automatiquement à la fin du fichier) et cela vous évite d'avoir à utiliser l'outil d'analyse des données. rstrip car le saut de ligne de fin est déjà coupé.

L'erreur est causée par la condition de sortie, qui ne peut jamais être vraie : Même si le fichier est épuisé, readline retournera une chaîne vide, et non None . Notez également que vous pouvez toujours rencontrer des problèmes avec les lignes vides, par exemple à la fin du fichier. Ajout de if line.strip() == "": continue fait que le code ignore les lignes vides, ce qui est probablement une bonne chose de toute façon.

7voto

Hugh Bothwell Points 22635
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(str(int(line, 16)))
                outf.write('\n')
            except ValueError:
                print("Could not parse '{0}'".format(line))

2voto

bukzor Points 11085

Vous devez vous renseigner sur 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:]))

1voto

Rumple Stiltskin Points 2309

Ceci est probablement dû à une ligne vide à la fin de votre fichier d'entrée.

Essayez ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X