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:там.
всезначний

Відповіді:


311

Просто для запису:

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

Треба використовувати!


101
Я просто додам, щоб забезпечити більшу чіткість для майбутніх читачів, що дійсно, int (float ('1.0')) працює, коли int ('1.0') кидає ValueError.
katyhuff

5
Це має бути прийнятою головною відповіддю на це питання. Я майже закрив сторінку і не побачив її. Дякую!
iTurki

2
додати відповідь int (float ('55063.000000')), оскільки питання get int (). Чим це справді найкраща відповідь
Макс

Чому це відбувається? @katyhuff
Muhamed Huseinbašić

7
Здається, ця відповідь не має нічого спільного з питанням. Питання полягає в тому, як можна запобігти ValueError, коли ви дзвоните int()в порожню рядок. "Використовувати замість float ()" не вирішує цю проблему. Ви все одно отримуєте ValueError.
Кевін

74

Наступні цілком прийнятні в python:

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

Але ви отримуєте a, 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

7
Здається, ця відповідь не має нічого спільного з питанням. Питання полягає в тому, як можна запобігти ValueError, коли ви дзвоните int()в порожню рядок. "Використовувати замість float ()" не вирішує цю проблему. Ви все одно отримуєте ValueError.
Кевін

3
@Kevin Хоча це прямо не відповідає на питання ОП. Однак це допомагає людям, які мають цю проблему, і не проти int(float(x)). Оскільки це перше питання, яке з’явиться під час пошуку цієї помилки.
Кервін

57

Пітонічний спосіб ітерації над файлом та перетворення в 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

4
Ваша спроба / за винятком не відрізняє щось розумне очікуване (порожній / порожній рядок) і щось неприємне, як неціле число.
Джон Махін

і чому ви хочете розрізняти ці речі?
SilentGhost

3
тому що одне є розумним очікуванням та незнанням, але інше вказує на помилку
Джон Махін

3
і чому порожній рядок розумно очікуваний, а не ціле число - ні?
SilentGhost

1
це добре, якщо ви впевнені, що ваш список насправді є переліком послідовних цілих чисел. Якщо ви не впевнені, що можете зробити,n = int(line) if line.is_integer() else int(float(line))
Майк Фурлендер,

23

Я знайшов собі роботу. Python перетворить число в float. Просто спочатку зателефонуйте до float, а потім перетворите це на int: output = int(float(input))


11

Причина полягає в тому, що ви отримуєте порожній рядок або рядок як аргумент в int. Перевірте, чи він порожній чи містить альфа-символи. Якщо він містить символи, просто ігноруйте цю частину.


2
Це більше схоже на коментар. Коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію.
Джошуа Дрейк

8

Причина, по якій ви отримуєте цю помилку, полягає в тому, що ви намагаєтеся перетворити символ пробілу в ціле число, що абсолютно неможливо і обмежено. І саме тому ви отримуєте цю помилку.введіть тут опис зображення

Перевірте свій код і виправте його, він буде добре працювати


8

Тож якщо є

floatInString = '5.0'

Ви можете перетворити його intзfloatInInt = int(float(floatInString))


3

У вас є проблема з цією лінією:

while file_to_read != " ":

Тут не знайдеться порожня рядок. Він знаходить рядок, що складається з одного простору. Імовірно, це не те, що ви шукаєте.

Прислухайтеся до порад усіх інших. Це не дуже ідіоматичний код python, і було б набагато зрозуміліше, якщо ви повторюєте файл безпосередньо, але я думаю, що цю проблему також варто відзначити.


3

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


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 не міг перетворити на цілі числа.


4
Не могли б ви детальніше розглянути кілька прикладів того, як ОП може це вирішити?
fmendez

порожнє значення означає порожнє, яке може бути перетворене в плаваючий рядок. Якщо ви спробуєте перетворити на float, він також покаже помилку
saravanan saminathan

0

Я потрапив у цю ж проблему при спробі використання readlines () всередині циклу для одного і того ж файлового об’єкта ... Моя підозра викликає readling () всередині readline () для того ж файлового об'єкта, що спричинив цю помилку.

Найкращим рішенням може бути використання search (0) для скидання вказівника на файл або обробку умови із встановленням якогось прапора, а потім створення нового об'єкта для того ж файлу, перевіривши встановлену умову ....


0

Нещодавно я натрапив на випадок, коли жодна з цих відповідей не спрацювала. У мене виникли дані CSV, де були нульові байти, змішані з даними, і ці нульові байти не знімалися. Отже, мій числовий рядок після зачистки складався з таких байтів:

\x00\x31\x00\x0d\x00

Щоб протистояти цьому, я зробив:

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

... де поля - це список значень 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()

Він виправляє відформатований вихід


0

ваша відповідь - кидання помилок через цей рядок

readings = int(readings)
  1. Тут ви намагаєтеся перетворити рядок у тип int, який не є базовим-10. ви можете перетворити рядок у int, лише якщо він є base-10, інакше він кине ValueError, вказавши недійсний літерал для int () з базою 10.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.