ValueError: littéral non valide pour int () avec la base 10: ''

333

Je crée un programme qui lit un fichier et si la première ligne du fichier n'est pas vide, il lit les quatre lignes suivantes. Les calculs sont effectués sur ces lignes, puis la ligne suivante est lue. Si cette ligne n'est pas vide, elle continue. Cependant, je reçois cette erreur:

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

Il lit la première ligne mais ne peut pas la convertir en entier.

Que puis-je faire pour résoudre ce problème?

Le code:

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
la source
3
Vous devriez envisager de l'utiliser with open(file_to_read, 'r') as infile:là-bas.
Omnifarious

Réponses:

313

Juste pour info:

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

M'a ici ...

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

Doit être utilisé!

FdoBad
la source
101
J'ajouterai simplement, pour plus de clarté pour les futurs lecteurs, qu'en effet, int (float ('1.0')) fonctionne quand int ('1.0') lance la ValueError.
katyhuff
5
Cela devrait être la meilleure réponse acceptée à cette question. J'ai presque fermé la page et je ne l'ai pas vue. Merci!
iTurki
2
ajouter à la réponse int (float ('55063.000000')) car la question est get int (). Que ce sera vraiment la meilleure réponse
Max
Pourquoi cela arrive-t-il? @katyhuff
Muhamed Huseinbašić
7
Cette réponse ne semble avoir rien à voir avec la question. La question est de savoir comment on pourrait empêcher une ValueError lorsque vous appelez int()une chaîne vide. "Utilisez float () à la place" ne résout pas ce problème. Vous obtenez toujours une ValueError.
Kevin
74

Les éléments suivants sont totalement acceptables en python:

  • passer une représentation sous forme de chaîne d'un entier dans int
  • passer une représentation sous forme de chaîne d'un flotteur dans float
  • passer une représentation sous forme de chaîne d'un entier dans float
  • passer un flotteur dans int
  • passer un entier dans float

Mais vous obtenez un ValueErrorsi vous passez une représentation de chaîne d'un flotteur dans int, ou une représentation de chaîne de quoi que ce soit , mais un entier (y compris chaîne vide). Si vous voulez passer une représentation sous forme de chaîne d'un flottant à un int, comme le souligne @katyhuff ci-dessus, vous pouvez d'abord le convertir en un flottant, puis en un entier:

>>> 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
la source
7
Cette réponse ne semble avoir rien à voir avec la question. La question est de savoir comment on pourrait empêcher une ValueError lorsque vous appelez int()une chaîne vide. "Utilisez float () à la place" ne résout pas ce problème. Vous obtenez toujours une ValueError.
Kevin
3
@Kevin Même si cela ne répond pas directement à la question du PO. Cela aide cependant les personnes qui ont ce problème et qui ne s'en soucient pas int(float(x)). Comme c'est la première question à apparaître lors de la recherche de cette erreur.
Kerwin Sneijders
57

Façon pythonique d'itérer sur un fichier et de convertir en int:

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

Ce que vous essayez de faire est un peu plus compliqué, mais toujours pas simple:

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

De cette façon, il traite 5 lignes à la fois. Utilisez h.next()plutôt next(h)qu'avant Python 2.6.

La raison en ValueErrorest que intvous ne pouvez pas convertir une chaîne vide en entier. Dans ce cas, vous devez soit vérifier le contenu de la chaîne avant la conversion, soit excepter une erreur:

try:
   int('')
except ValueError:
   pass      # or whatever
SilentGhost
la source
4
Votre essai / except ne fait pas de distinction entre quelque chose de raisonnablement prévisible (ligne vide / vide) et quelque chose de méchant comme un non entier.
John Machin
et pourquoi voudriez-vous distinguer ces choses?
SilentGhost
3
parce que l'un est raisonnablement prévisible et ignorable, mais l'autre indique une erreur
John Machin
3
et pourquoi une ligne vierge est-elle raisonnablement prévisible et non entière n'est pas?
SilentGhost
1
c'est bien si vous êtes sûr que votre liste est en fait une liste d'entiers stringifiés. Si vous n'êtes pas sûr de pouvoir le fairen = int(line) if line.is_integer() else int(float(line))
Mike Furlender
23

J'ai trouvé un travail autour. Python convertira le nombre en un flottant. Il suffit d'appeler float d'abord, puis de convertir cela en entier fonctionnera: output = int(float(input))

Brad123
la source
11

La raison en est que vous obtenez une chaîne vide ou une chaîne comme argument dans int. Vérifiez s'il est vide ou s'il contient des caractères alpha. S'il contient des caractères, ignorez simplement cette partie.

rajender kumar
la source
2
Cela ressemble plus à un commentaire. Lorsque vous avez une réputation suffisante, vous pourrez commenter n'importe quel message.
Joshua Drake
8

La raison pour laquelle vous obtenez cette erreur est que vous essayez de convertir un caractère espace en entier, ce qui est totalement impossible et restreint, et c'est pourquoi vous obtenez cette erreur.entrez la description de l'image ici

Vérifiez votre code et corrigez-le, cela fonctionnera bien

Joish
la source
8

Donc si vous avez

floatInString = '5.0'

Vous pouvez le convertir en intavecfloatInInt = int(float(floatInString))

Harvey
la source
3

Vous avez un problème avec cette ligne:

while file_to_read != " ":

Cela ne trouve pas de chaîne vide. Il trouve une chaîne composée d'un espace. Vraisemblablement, ce n'est pas ce que vous recherchez.

Écoutez les conseils de tous les autres. Ce n'est pas du code python très idiomatique, et serait beaucoup plus clair si vous parcourez directement le fichier, mais je pense que ce problème mérite également d'être noté.

jcdyer
la source
3

Veuillez tester cette fonction ( split()) sur un fichier simple. J'étais confronté au même problème et j'ai découvert que c'était parce qu'il split()n'était pas écrit correctement (gestion des exceptions).

élixénide
la source
1
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

Il y a un problème avec ce code. readingsest une nouvelle ligne lue dans le fichier - c'est une chaîne. Par conséquent, vous ne devez pas le comparer à 0. De plus, vous ne pouvez pas simplement le convertir en un entier, sauf si vous êtes sûr c'est bien un. Par exemple, des lignes vides produiront des erreurs ici (comme vous l'avez sûrement découvert).

Et pourquoi avez-vous besoin du décompte mondial? C'est très certainement une mauvaise conception en Python.

Eli Bendersky
la source
1

Cela peut également se produire lorsque vous devez mapper des entiers séparés par des espaces à une liste mais que vous entrez les entiers ligne par ligne à l'aide de la .input(). Comme par exemple, je résolvais ce problème sur HackerRank Bon-Appetit , et j'ai obtenu l'erreur suivante lors de la compilation entrez la description de l'image ici

Donc, au lieu de donner une entrée au programme ligne par ligne, essayez de mapper les entiers séparés par des espaces dans une liste en utilisant la map()méthode.

Amit Kumar
la source
0

Je crée un programme qui lit un fichier et si la première ligne du fichier n'est pas vide, il lit les quatre lignes suivantes. Les calculs sont effectués sur ces lignes, puis la ligne suivante est lue.

Quelque chose comme ça devrait fonctionner:

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
la source
0

J'obtenais des erreurs similaires, il s'avère que l'ensemble de données avait des valeurs vides que python ne pouvait pas convertir en entier.

user2162611
la source
4
Pourriez-vous élaborer un peu plus avec quelques exemples sur la façon dont le PO pourrait le résoudre?
fmendez
une valeur vide signifie vide qui peut être converti en chaîne flottante. Si vous essayez de convertir en flottant, il affichera également une erreur
saravanan saminathan
0

Je suis entré dans le même problème en essayant d'utiliser readlines () à l'intérieur pour la boucle pour le même objet fichier ... Mon soupçon de tirer readling () à l'intérieur de readline () pour le même objet fichier a provoqué cette erreur.

La meilleure solution peut être d'utiliser la recherche (0) pour réinitialiser le pointeur de fichier ou gérer la condition en définissant un indicateur, puis créer un nouvel objet pour le même fichier en vérifiant la condition définie ....

Abhishek Jain
la source
0

J'ai récemment rencontré un cas où aucune de ces réponses n'a fonctionné. J'ai rencontré des données CSV où il y avait des octets nuls mélangés avec les données, et ces octets nuls n'ont pas été supprimés. Donc, ma chaîne numérique, après suppression, se composait d'octets comme ceci:

\x00\x31\x00\x0d\x00

Pour contrer cela, j'ai fait:

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

... où champs est une liste de valeurs csv résultant du fractionnement de la ligne.

T. Reed
la source
0

Il semble que les lectures soient parfois une chaîne vide et, évidemment, une erreur se produit. Vous pouvez ajouter une vérification supplémentaire à votre boucle while avant la commande int (lectures) comme:

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

J'ai eu du mal à comprendre la raison réelle, cela se produit lorsque nous ne lisons pas correctement le fichier. vous devez ouvrir le fichier et lire avec la méthode readlines () comme ci-dessous:

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

Il corrige la sortie formatée

Shaina Raza
la source
0

votre réponse génère des erreurs à cause de cette ligne

readings = int(readings)
  1. Ici, vous essayez de convertir une chaîne en type int qui n'est pas en base 10. vous ne pouvez convertir une chaîne en int que si elle est en base-10 sinon elle lancera ValueError, indiquant un littéral invalide pour int () avec base 10.
shubham
la source