Как перебирать файл в 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)
Каждое шестнадцатеричное число вводится в новую строку для ввода
Ответы
Ответ 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