Я создаю программу, которая читает файл и, если первая строка файла не пустая, читает следующие четыре строки. В этих строках выполняются вычисления, а затем считывается следующая строка. Если эта строка не пуста, то программа продолжает работу. Однако я получаю эту ошибку:
ValueError: invalid literal for int() with base 10: ''.
.
Он читает первую строку, но не может преобразовать ее в целое число.
Что я могу сделать, чтобы решить эту проблему?
Код:
file_to_read = raw_input("Enter file name of tests (empty string to end program):")
try:
infile = open(file_to_read, 'r')
while file_to_read != " ":
file_to_write = raw_input("Enter output file name (.csv will be appended to it):")
file_to_write = file_to_write + ".csv"
outfile = open(file_to_write, "w")
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
minimum = (infile.readline())
maximum = (infile.readline())
Просто для справки:
>>> int('55063.000000')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'
У меня здесь...
>>> float('55063.000000')
55063.0
Должен быть использован!
Питонический способ итерации по файлу и преобразования в int:
for line in open(fname):
if line.strip(): # line contains eol character(s)
n = int(line) # assuming single integer on each line
То, что вы пытаетесь сделать, немного сложнее, но все равно не просто:
h = open(fname)
for line in h:
if line.strip():
[int(next(h).strip()) for _ in range(4)] # list of integers
Таким образом, обрабатывается 5 строк за раз. До Python 2.6 используйте h.next()
вместо next(h)
.
Причина возникновения ValueError
заключается в том, что int
не может преобразовать пустую строку в целое число. В этом случае вам нужно либо проверить содержимое строки перед преобразованием, либо исключить ошибку:
try:
int('')
except ValueError:
pass # or whatever
Следующий совершенно приемлемо в Python:
int
поплавок
поплавок
int
поплавок
Но вы получаете ValueError
если передать строковое представление float в int
, или строковое представление ничего, но целое число (включая пустую строку). Если вы хотите передать строковое представление числа с плавающей точкой к типу int, а @katyhuff пунктов выше, можно преобразовать в float, а затем, чтобы целое число:
>>> int('5')
5
>>> float('5.0')
5.0
>>> float('5')
5.0
>>> int(5.0)
5
>>> float(5)
5.0
>>> int('5.0')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(float('5.0'))
5
Причина в том, что вы получаете пустую строку или строку в качестве аргумента в инт проверьте его, прежде чем он пустой или содержит альфа-персонажей или нет, если она содержит не игнорировать эту часть просто.
Вы'ве получил проблемы с этой линии:
while file_to_read != " ":
Это не найти пустую строку. Он находит строку, состоящую из одного пробела. Предположительно, это не то, что вы ищете.
Слушать все остальные'ы советы. Это не очень идиоматические Python-кода, и было бы гораздо понятнее, если вы перебора в файл напрямую, но я думаю, что эта проблема стоит отметить также.
Пожалуйста, протестировать эту функцию (Сплит()
) на простой файл. Я сталкиваются с той же проблемой и обнаружили, что это было, потому что сплит()
не было написано правильно (обработка исключений).
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
В этом коде есть проблема. readings
- это новая строка, считанная из файла - это строка. Поэтому вы не должны сравнивать ее с 0. Кроме того, вы не можете просто преобразовать ее в целое число, если вы не уверены, что оно действительно целое. Например, пустые строки будут выдавать ошибки (как вы уже наверняка выяснили).
И зачем вам нужен глобальный счетчик? Это, безусловно, плохой дизайн в Python.
Это также может произойти, когда у вас на карте целых чисел через пробел в списке, но вы введите строку чисел в строке .входные()
.
Например, я решал эту проблему на HackerRank Бон-Аппетит, и получил следующую ошибку при компиляции
Так а что дает ввод в программу построчно попытаться сопоставить целых чисел через пробел в списке с помощью карты()` метод.
Я создаю программу, которая читает файл и если первая строка файла не пустая, она читает следующие четыре строки. Вычисления выполняются на этих строк, а затем считывается следующая строка. считывается.
Что-то вроде этого должно работать:
for line in infile:
next_lines = []
if line.strip():
for i in xrange(4):
try:
next_lines.append(infile.next())
except StopIteration:
break
# Do your calculation with "4 lines" here
Я получаю подобные ошибки, получается, что набор данных был пустой ценностей, Python не может преобразовать в число.
Я попал в тот же вопрос, когда пытаюсь использовать readlines() внутри цикла for для одного объекта файл... мои подозрения стреляет readling() внутри с readline() для объекта файла, вызвавшего эту ошибку.
Лучшее решение можно использовать seek(0) для сброса указателя файла или Ручка состоянии с установкой, то какой флаг создать новый объект на тот же файл, проверяя условие поставили....