ValueError: literal inválido para int () com base 10: ''

333

Estou criando um programa que lê um arquivo e, se a primeira linha do arquivo não estiver em branco, ele lerá as próximas quatro linhas. Os cálculos são realizados nessas linhas e, em seguida, a próxima linha é lida. Se essa linha não estiver vazia, ela continua. No entanto, estou recebendo este erro:

ValueError: invalid literal for int() with base 10: ''.

Está lendo a primeira linha, mas não pode convertê-la em um número inteiro.

O que posso fazer para corrigir esse problema?

O código:

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())
Sarah Cox
fonte
3
Você deve considerar usar with open(file_to_read, 'r') as infile:lá.
Onnário, 14/09

Respostas:

312

Apenas para o registro:

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

Me pegou aqui ...

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

Tem que ser usado!

FdoBad
fonte
101
Vou acrescentar, para fornecer mais clareza aos futuros leitores, que de fato, int (float ('1.0')) funciona quando int ('1.0') lança o ValueError.
katyhuff
5
Essa deve ser a principal resposta aceita para esta pergunta. Quase fechei a página e não a vi. Obrigado!
iTurki
2
adicione à resposta int (float ('55063.000000')), pois a pergunta é get int (). Do que vai realy resposta superior
Max
Por que isso acontece? @katyhuff
Muhamed Huseinbašić
7
Esta resposta não parece ter nada a ver com a pergunta. A pergunta está perguntando como alguém poderia impedir um ValueError quando você chama int()uma string vazia. "Usar float ()" não resolve esse problema. Você ainda recebe um ValueError.
Kevin
74

Os seguintes itens são totalmente aceitáveis ​​em python:

  • passando uma representação de string de um número inteiro para int
  • passando uma representação de string de um flutuador para float
  • passando uma representação de string de um número inteiro para float
  • passando um carro alegórico int
  • passando um número inteiro para float

Mas você começa a ValueErrorse passar uma representação de cadeia de um flutuador em int, ou a representação cadeia de qualquer coisa mas um inteiro (incluindo string vazia). Se você deseja passar uma representação de string de um float para um int, como @katyhuff aponta acima, você pode converter primeiro em um float e depois em um número inteiro:

>>> 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
Peter
fonte
7
Esta resposta não parece ter nada a ver com a pergunta. A questão é perguntar como alguém poderia impedir um ValueError quando você chama int()uma string vazia. "Usar float ()" não resolve esse problema. Você ainda recebe um ValueError.
Kevin
3
@ Kevin Mesmo que isso não responda diretamente à pergunta do OP. No entanto, ajuda as pessoas que têm esse problema e não se importam com o int(float(x)). Como esta é a primeira pergunta a aparecer ao procurar esse erro.
Kerwin Sneijders
57

Maneira pitônica de iterar sobre um arquivo e converter para int:

for line in open(fname):
   if line.strip():           # line contains eol character(s)
       n = int(line)          # assuming single integer on each line

O que você está tentando fazer é um pouco mais complicado, mas ainda não é direto:

h = open(fname)
for line in h:
    if line.strip():
        [int(next(h).strip()) for _ in range(4)]     # list of integers

Desta forma, processa 5 linhas por vez. Use em h.next()vez de next(h)antes do Python 2.6.

A razão que você teve ValueErrorfoi porque intnão é possível converter uma sequência vazia para o número inteiro. Nesse caso, você precisa verificar o conteúdo da string antes da conversão ou exceto um erro:

try:
   int('')
except ValueError:
   pass      # or whatever
SilentGhost
fonte
4
Sua tentativa / exceção não faz distinção entre algo razoável esperado (linha em branco / vazio) e algo desagradável como um não inteiro.
John Machin
e por que você gostaria de distinguir essas coisas?
SilentGhost
3
porque um é razoavelmente previsível e ignorable mas o outro é indicativo de um erro
John Machin
3
e por que uma linha em branco é razoavelmente esperável e não inteira não é?
SilentGhost 5/12/2009
1
isso é bom se você tiver certeza de que sua lista é realmente uma lista de números inteiros com strings. Se você não tem certeza que você pode fazern = int(line) if line.is_integer() else int(float(line))
Mike Furlender
23

Eu encontrei um trabalho ao redor. Python converterá o número em um flutuador. Simplesmente chamar float primeiro e depois converter isso para um int funcionará: output = int(float(input))

Brad123
fonte
11

O motivo é que você está obtendo uma string vazia ou uma string como argumento no int. Verifique se está vazio ou se contém caracteres alfa. Se ele contiver caracteres, simplesmente ignore essa parte.

rajender kumar
fonte
2
Parece mais um comentário. Quando você tiver reputação suficiente, poderá comentar em qualquer postagem.
Joshua Drake
8

O motivo pelo qual você está recebendo esse erro é que está tentando converter um caractere de espaço em um número inteiro, o que é totalmente impossível e restrito. E é por isso que você está recebendo esse erro.insira a descrição da imagem aqui

Verifique seu código e corrija, ele funcionará bem

Joish
fonte
8

Então se você tem

floatInString = '5.0'

Você pode convertê-lo para intcomfloatInInt = int(float(floatInString))

Harvey
fonte
3

Você tem um problema com esta linha:

while file_to_read != " ":

Isso não encontra uma string vazia. Ele encontra uma string que consiste em um espaço. Presumivelmente, não é isso que você está procurando.

Ouça os conselhos de todos os outros. Este não é um código python muito idiomático e seria muito mais claro se você iterar diretamente sobre o arquivo, mas acho que esse problema também vale a pena notar.

jcdyer
fonte
3

Por favor, teste esta função ( split()) em um arquivo simples. Eu estava enfrentando o mesmo problema e descobri que era porque split()não foi escrito corretamente (manipulação de exceção).

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

Há um problema com esse código. readingsé uma nova linha lida no arquivo - é uma string. Portanto, você não deve compará-lo com 0. Além disso, você não pode simplesmente convertê-lo em um número inteiro, a menos que tenha certeza que é realmente um. Por exemplo, linhas vazias produzirão erros aqui (como você certamente descobriu).

E por que você precisa da contagem global? Esse certamente é um design ruim em Python.

Eli Bendersky
fonte
1

Isso também pode acontecer quando você precisa mapear números inteiros separados por espaço para uma lista, mas insere os números inteiros linha por linha usando o .input(). Como por exemplo, eu estava resolvendo esse problema no HackerRank Bon-Appetit , e recebi o seguinte erro ao compilar insira a descrição da imagem aqui

Portanto, em vez de dar entrada ao programa linha por linha, tente mapear os números inteiros separados por espaço em uma lista usando o map()método

Amit Kumar
fonte
0

Estou criando um programa que lê um arquivo e, se a primeira linha do arquivo não estiver em branco, ele lerá as próximas quatro linhas. Os cálculos são realizados nessas linhas e, em seguida, a próxima linha é lida.

Algo assim deve funcionar:

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
Imran
fonte
0

Eu estava recebendo erros semelhantes, verifica-se que o conjunto de dados tinha valores em branco que o python não pôde converter em número inteiro.

user2162611
fonte
4
Você poderia elaborar um pouco mais com alguns exemplos de como o OP poderia resolvê-lo?
fmendez
valor em branco significa vazio que pode ser convertido em string float. Se você tentar converter para flutuar, ele também mostrará erro
saravanan saminathan
0

Entrei no mesmo problema ao tentar usar o readlines () dentro do loop for para o mesmo objeto de arquivo ... Minha suspeita é disparar readling () dentro do readline () para o mesmo objeto de arquivo causou esse erro.

A melhor solução pode ser usar seek (0) para redefinir o ponteiro do arquivo ou manipular a condição com a definição de algum sinalizador e criar um novo objeto para o mesmo arquivo, verificando a condição definida ....

Abhishek Jain
fonte
0

Recentemente, deparei-me com um caso em que nenhuma dessas respostas funcionava. Encontrei dados CSV onde havia bytes nulos misturados com os dados e esses bytes nulos não foram removidos. Então, minha string numérica, após a remoção, consistia em bytes como este:

\x00\x31\x00\x0d\x00

Para combater isso, eu fiz:

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

... where fields é uma lista de valores csv resultantes da divisão da linha.

T. Reed
fonte
0

Às vezes, parece que as leituras são uma string vazia e, obviamente, surge um erro. Você pode adicionar uma verificação extra ao seu loop while antes do comando int (leituras) como:

while readings != 0 | readings != '':
    global count
    readings = int(readings)
Kanishk Mair
fonte
0

Eu tive dificuldade em descobrir o motivo real, isso acontece quando não lemos corretamente do arquivo. você precisa abrir o arquivo e ler com o método readlines () como abaixo:

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

Corrige a saída formatada

Shaina Raza
fonte
0

sua resposta está gerando erros por causa dessa linha

readings = int(readings)
  1. Aqui você está tentando converter uma string em um tipo int que não seja base-10. você pode converter uma string em int apenas se for base-10, caso contrário, lançará ValueError, declarando literal inválido para int () com base 10.
Shubham
fonte