ValueError: недопустимый литерал для int () с основанием 10: '' - PullRequest
213 голосов
/ 03 декабря 2009

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

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

Ответы [ 13 ]

240 голосов
/ 21 января 2012

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

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

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

51 голосов
/ 03 декабря 2009

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
38 голосов
/ 12 декабря 2017

В питоне полностью допустимо следующее:

  • передача строкового представления целого числа в 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
10 голосов
/ 23 июня 2017

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

4 голосов
/ 27 марта 2018

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

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

3 голосов
/ 05 июня 2014

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

3 голосов
/ 03 декабря 2009

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

while file_to_read != " ":

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

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

1 голос
/ 23 апреля 2019

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

1 голос
/ 28 ноября 2017

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

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

1 голос
/ 03 декабря 2009
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...