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

333

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

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())
Сара Кокс
источник
3
Вы должны рассмотреть возможность использования with open(file_to_read, 'r') as infile:там.
всевозможный

Ответы:

313

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

>>> int('55063.000000')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'

Получил меня здесь ...

>>> int(float('55063.000000'))
55063.0

Должен быть использован!

FdoBad
источник
101
Я просто добавлю, для большей ясности для будущих читателей, что действительно, int (float ('1.0')) работает, когда int ('1.0') выбрасывает ValueError.
katyhuff
5
Это должно быть общепризнанным ответом на этот вопрос. Я почти закрыл страницу и не увидел ее. Спасибо!
iTurki
2
добавьте в ответ int (float ('55063.000000')), так как вопрос - get int (). Чем это будет действительно главный ответ
Макс
Почему это происходит? @katyhuff
Мухамед Хусейнбашич
7
Этот ответ, похоже, не имеет ничего общего с вопросом. Вопрос в том, как можно предотвратить ошибку ValueError, когда вы вызываете int()пустую строку. «Используйте вместо этого float ()» не решает эту проблему. Вы все еще получаете ValueError.
Кевин
74

Следующее полностью приемлемо в Python:

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

Но вы получите , ValueErrorесли передать строковое представление поплавка в intили строковое представление чего - либо , но целое число ( в том числе пустая строка). Если вы хотите передать строковое представление числа с плавающей точкой int, как указывает @katyhuff выше, вы можете сначала преобразовать в число с плавающей точкой, а затем в целое число:

>>> 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
Питер
источник
7
Этот ответ, похоже, не имеет ничего общего с вопросом. Вопрос в том, как можно предотвратить ошибку ValueError, когда вы вызываете int()пустую строку. «Используйте вместо этого float ()» не решает эту проблему. Вы все еще получаете ValueError.
Кевин
3
@Kevin Хотя это и не дает прямого ответа на вопрос ОП. Это, однако, помогает людям, которые имеют эту проблему и не против int(float(x)). Так как это первый вопрос, который появляется при поиске этой ошибки.
Кервин Снейдерс,
57

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
SilentGhost
источник
4
Ваша попытка / исключение не делает различий между чем-то разумным ожидаемым (пустая / пустая строка) и чем-то неприятным, как нецелое число
Джон Мачин
и почему вы хотите различать эти вещи?
SilentGhost
3
потому что одно можно ожидать и игнорировать, а другое указывает на ошибку
Джон Мачин
3
и почему пустая строка разумно ожидаема, а не целая - нет?
SilentGhost
1
это хорошо, если вы уверены, что ваш список на самом деле представляет собой список строковых целых чисел. Если вы не уверены, что можете это сделатьn = int(line) if line.is_integer() else int(float(line))
Майк Фурлендер,
23

Я нашел работу вокруг. Python преобразует число в число с плавающей точкой. Сначала просто вызовет float, а затем преобразует его в int: output = int(float(input))

Brad123
источник
11

Причина в том, что вы получаете пустую строку или строку в качестве аргумента в int. Проверьте, является ли он пустым или содержит буквенные символы. Если он содержит символы, просто игнорируйте эту часть.

Раджендер Кумар
источник
2
Это больше похоже на комментарий. Когда у вас будет достаточно репутации, вы сможете комментировать любой пост.
Джошуа Дрейк
8

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

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

Joish
источник
8

Так что если у вас есть

floatInString = '5.0'

Вы можете преобразовать его intсfloatInInt = int(float(floatInString))

Харви
источник
3

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

while file_to_read != " ":

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

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

jcdyer
источник
3

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

elixenide
источник
1
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

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

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

Эли Бендерский
источник
1

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

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

Амит Кумар
источник
0

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

Примерно так должно работать:

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
Имран
источник
0

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

user2162611
источник
4
Не могли бы вы подробнее рассказать о некоторых примерах того, как ОП может решить эту проблему?
fmendez
пустое значение означает пустой, который может быть преобразован в строку с плавающей точкой. Если вы попытаетесь конвертировать в float, это также покажет ошибку
saravanan saminathan
0

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

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

Абхишек Джайн
источник
0

Недавно мне попался случай, когда ни один из этих ответов не сработал. Я столкнулся с данными CSV, в которых были нулевые байты, смешанные с данными, и эти нулевые байты не были удалены. Итак, моя числовая строка, после удаления, состояла из таких байтов:

\x00\x31\x00\x0d\x00

Чтобы противостоять этому, я сделал:

countStr = fields[3].replace('\x00', '').strip()
count = int(countStr)

... где fields - список значений csv, полученных в результате разбиения строки.

Т. Рид
источник
0

Кажется, что показания иногда являются пустой строкой, и, очевидно, возникает ошибка. Вы можете добавить дополнительную проверку в цикл while перед командой int (readings), например:

while readings != 0 | readings != '':
    global count
    readings = int(readings)
Канишк Майр
источник
0

Мне было трудно выяснить истинную причину, это происходит, когда мы не читаем правильно из файла. вам нужно открыть файл и прочитать с помощью метода readlines (), как показано ниже:

with open('/content/drive/pre-processed-users1.1.tsv') as f:
    file=f.readlines()

Исправляет форматированный вывод

Shaina Raza
источник
0

ваш ответ выбрасывает ошибки из-за этой строки

readings = int(readings)
  1. Здесь вы пытаетесь преобразовать строку в тип int, который не является base-10. Вы можете преобразовать строку в int только в том случае, если она равна base-10, в противном случае она выдаст ValueError, указав недопустимый литерал для int () с основанием 10.
Shubham
источник