ValueError: неверный литерал для int() с базой 10: ''

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

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

Ответ 1

Только для записи:

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

Используется!

Ответ 2

Pythonic способ итерации по файлу и преобразования в 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 строк в то время. Используйте h.next() вместо next(h) до Python 2.6.

Причина, по которой вы имели ValueError, состоит в том, что int не может преобразовать пустую строку в целое число. В этом случае вам нужно либо проверить содержимое строки перед преобразованием, либо за исключением ошибки:

try:
   int('')
except ValueError:
   pass      # or whatever

Ответ 3

В python вполне приемлемы следующие:

  • передавая строковое представление целого числа в int
  • передача строкового представления поплавка в float
  • передача строкового представления целого числа в float
  • передача float в int
  • передача целого числа в float

Но вы получаете ValueError если передаете строковое представление float в int или строковое представление чего-либо, кроме целого (включая пустую строку). Если вы хотите передать строковое представление float в 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

Ответ 4

Причина: вы получаете пустую строку или строку в качестве аргумента в int проверить его до того, как он пуст или содержит альфа-символы или нет, если он содержит, чем просто игнорировать эту часть.

Ответ 5

У вас есть проблема с этой строкой:

while file_to_read != " ":

Это не находит пустую строку. Он находит строку, состоящую из одного пробела. Предположительно, это не то, что вы ищете.

Слушайте все остальные советы. Это не очень идиоматический код на Python, и было бы намного яснее, если бы вы перебирали файл напрямую, но я думаю, что эта проблема тоже стоит отметить.

Ответ 6

Проверьте эту функцию (split()) на простой файл. Я столкнулся с той же проблемой и обнаружил, что это потому, что split() не был правильно написан (обработка исключений).

Ответ 7

    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

Проблема с этим кодом. readings - это новая строка, считанная из файла - это строка. Поэтому вы не должны сравнивать его с 0. Кроме того, вы не можете просто преобразовать его в целое число, если вы не уверены в этом. Например, пустые строки будут вызывать ошибки здесь (как вы наверняка узнали).

И зачем вам глобальный счет? Это, безусловно, плохой дизайн в Python.

Ответ 8

Я создаю программу, которая читает файл, и если первая строка файла не является пустым, он читает следующие четыре линий. Расчеты выполняются по эти строки, а затем следующая строка читать.

Что-то вроде этого должно работать:

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

Ответ 9

Я получал похожие ошибки, получается, что в наборе данных были пустые значения, которые python не мог преобразовать в integer.

Ответ 10

Это также может произойти, когда вам нужно сопоставить целые числа, разделенные пробелом, в список, но вы вводите целые числа по строкам с помощью .input(). Например, я решал эту проблему на HackerRank Bon-Appetit, и при компиляции получена следующая ошибка введите описание изображения здесь

Поэтому вместо того, чтобы вводить строку в строку программы, попробуйте сопоставить целые числа, разделенные пробелами, в список, используя метод map().

Ответ 11

Причина, по которой вы получаете эту ошибку, заключается в том, что вы пытаетесь преобразовать символ пробела в целое число, что совершенно невозможно и ограничено. И почему вы получаете эту ошибку. enter image description here

Проверьте свой код и исправьте его, он будет работать нормально

Ответ 12

Я попал в ту же проблему при попытке использовать readlines() внутри цикла для одного и того же объекта файла... Мое подозрение - это стрельба readling() внутри readline() для того же файла, вызвавшего эту ошибку.

Лучшим решением может быть использование seek (0) для сброса указателя файла или условия обработки с установкой некоторого флага, а затем создания нового объекта для того же файла путем проверки установленного условия....