Подтвердить что ты не робот

Как перебирать файл в 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: ''

Мой код выглядит следующим образом

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)

Каждое шестнадцатеричное число вводится в новую строку для ввода

4b9b3361

Ответ 1

Отслеживание указывает, что, вероятно, у вас есть пустая строка в конце файла. Вы можете исправить это следующим образом:

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)

С другой стороны, было бы лучше использовать for x in f вместо readline. Не забудьте закрыть ваши файлы или лучше использовать with, которые закроют их для вас:

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)

Ответ 2

Просто используйте for x in f: ..., это дает вам строку после строки, намного короче и читабельнее (отчасти потому, что она автоматически останавливается, когда файл заканчивается), а также сохраняет вызов rstrip, потому что завершающая новая строка уже скошена.

Ошибка вызвана условием выхода, которое никогда не может быть правдой: даже если файл исчерпан, readline вернет пустую строку, а не None. Также обратите внимание, что вы все равно можете столкнуться с проблемами с пустыми строками, например. в конце файла. Добавление if line.strip() == "": continue заставляет код игнорировать пустые строки, что в любом случае является хорошей вещью.

Ответ 3

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

Ответ 4

Вы должны узнать о 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:]))

Ответ 5

Это, вероятно, из-за пустой строки в конце вашего входного файла.

Попробуйте следующее:

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