ValueError: niepoprawny literał dla int () z bazą 10: ''


333

Tworzę program, który czyta plik i jeśli pierwszy wiersz pliku nie jest pusty, odczytuje kolejne cztery wiersze. Obliczenia są wykonywane na tych liniach, a następnie odczytywany jest następny wiersz. Jeśli ten wiersz nie jest pusty, kontynuuje. Jednak pojawia się ten błąd:

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

Czyta pierwszy wiersz, ale nie może go przekonwertować na liczbę całkowitą.

Co mogę zrobić, aby rozwiązać ten problem?

Kod:

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
Powinieneś rozważyć użycie with open(file_to_read, 'r') as infile:tam.
Wszechobecny

Odpowiedzi:


311

Dla przypomnienia:

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

Masz mnie tutaj ...

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

Musi być użyty!


101
Dodam tylko, aby zapewnić czytelnikom większą przejrzystość, że rzeczywiście int (float („1.0”)) działa, gdy int („1.0”) zgłasza błąd ValueError.
katyhuff

5
To powinna być zaakceptowana najwyższa odpowiedź na to pytanie. Prawie zamknąłem stronę i jej nie widziałem. Dzięki!
iTurki,

2
dodaj do odpowiedzi int (float ('55063.000000')), ponieważ pytaniem jest get int (). Niż naprawdę najlepsza odpowiedź
Max

Dlaczego to się dzieje? @katyhuff
Muhamed Huseinbašić

7
Wydaje się, że ta odpowiedź nie ma nic wspólnego z pytaniem. Pytanie brzmi: jak można zapobiec wystąpieniu błędu ValueError, gdy wywoływany int()jest pusty ciąg znaków? „Zamiast tego użyj float ()” nie rozwiązuje tego problemu. Nadal pojawia się błąd ValueError.
Kevin

74

W Pythonie są całkowicie dopuszczalne:

  • przekazanie ciągu reprezentującego liczbę całkowitą do int
  • przekazując ciąg reprezentujący liczbę zmiennoprzecinkową do float
  • przekazanie ciągu reprezentującego liczbę całkowitą do float
  • przekazując pływaka do int
  • przekazanie liczby całkowitej do float

Ale dostajesz a, ValueErrorjeśli przekazujesz ciąg znaków reprezentujący liczbę zmiennoprzecinkową do int, lub ciąg znaków reprezentujący cokolwiek poza liczbą całkowitą (w tym pusty ciąg). Jeśli chcesz przekazać ciąg znaków reprezentujący liczbę zmiennoprzecinkową do int, jak wskazuje @katyhuff, możesz najpierw przekonwertować na liczbę zmiennoprzecinkową, a następnie na liczbę całkowitą:

>>> 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
Wydaje się, że ta odpowiedź nie ma nic wspólnego z pytaniem. Pytanie brzmi: jak można zapobiec wystąpieniu błędu ValueError, gdy wywoływany int()jest pusty ciąg znaków? „Zamiast tego użyj float ()” nie rozwiązuje tego problemu. Nadal pojawia się błąd ValueError.
Kevin

3
@Kevin Mimo że nie odpowiada to bezpośrednio na pytanie PO. Pomaga jednak ludziom, którzy mają ten problem i nie mają nic przeciwko int(float(x)). Ponieważ jest to pierwsze pytanie, które pojawia się podczas wyszukiwania tego błędu.
Kerwin Sneijders

57

Pythoniczny sposób iteracji po pliku i konwersji na int:

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

To, co próbujesz zrobić, jest nieco bardziej skomplikowane, ale nadal nie jest proste:

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

W ten sposób przetwarza 5 linii jednocześnie. Użyj h.next()zamiast next(h)przed Python 2.6.

Powodem było ValueErrorto, że intnie można przekonwertować pustego ciągu na liczbę całkowitą. W takim przypadku przed konwersją należy sprawdzić zawartość ciągu lub z wyjątkiem błędu:

try:
   int('')
except ValueError:
   pass      # or whatever

4
Twoja próba / wyjątek nie rozróżnia między czymś rozsądnie przewidywalnym (pusta / pusta linia) a czymś nieprzyjemnym jak liczba całkowita.
John Machin,

i dlaczego chcesz wyróżnić te rzeczy?
SilentGhost,

3
ponieważ jeden jest rozsądnie przewidywalny i niezauważalny, ale drugi wskazuje na błąd
John Machin

3
i dlaczego racjonalnie można oczekiwać pustej linii, a nie liczby całkowitej?
SilentGhost,

1
jest to dobre, jeśli masz pewność, że twoja lista jest w rzeczywistości listą całkowitych liczb. Jeśli nie jesteś pewien, czy możesz to zrobićn = int(line) if line.is_integer() else int(float(line))
Mike Furlender

23

Znalazłem pracę. Python skonwertuje liczbę na liczbę zmiennoprzecinkową. Po prostu wywołanie float, a następnie przekonwertowanie go na int zadziała: output = int(float(input))


11

Powodem jest to, że otrzymujesz pusty ciąg lub ciąg jako argument do int. Sprawdź, czy jest pusty lub zawiera znaki alfabetu. Jeśli zawiera znaki, po prostu zignoruj ​​tę część.


2
To bardziej przypomina komentarz. Gdy będziesz mieć odpowiednią reputację, będziesz mógł komentować każdy post.
Joshua Drake

8

Przyczyną tego błędu jest to, że próbujesz przekonwertować znak spacji na liczbę całkowitą, co jest całkowicie niemożliwe i ograniczone. Dlatego otrzymujesz ten błąd.wprowadź opis zdjęcia tutaj

Sprawdź swój kod i popraw go, będzie działał dobrze


8

Więc jeśli masz

floatInString = '5.0'

Możesz to przekonwertować za intpomocąfloatInInt = int(float(floatInString))


3

Masz problem z tą linią:

while file_to_read != " ":

To nie znajduje pustego ciągu. Znajduje ciąg składający się z jednej spacji. Przypuszczalnie nie tego szukasz.

Posłuchaj rad innych. Nie jest to bardzo idiomatyczny kod Pythona i byłoby znacznie jaśniejsze, gdybyś iterował bezpośrednio nad plikiem, ale myślę, że ten problem również jest wart uwagi.


3

Sprawdź tę funkcję ( split()) w prostym pliku. Napotkałem ten sam problem i stwierdziłem, że było tak, ponieważ split()nie został napisany poprawnie (obsługa wyjątków).


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

Wystąpił problem z tym kodem. readingsto nowa linia odczytana z pliku - to ciąg znaków. Dlatego nie powinieneś porównywać go do 0. Co więcej, nie możesz po prostu przekonwertować go na liczbę całkowitą, chyba że jesteś pewien, że to rzeczywiście jedna. Na przykład puste linie będą powodować błędy (jak na pewno się dowiedziałeś).

A dlaczego potrzebujesz globalnej liczby? To z pewnością zły projekt w Pythonie.


1

To może się zdarzyć, gdy masz do mapy oddzielonych spacjami liczb całkowitych na liście, ale wprowadzić linię liczb całkowitych przez linię użyciu .input(). Na przykład rozwiązałem ten problem na HackerRank Bon-Appetit , a podczas kompilacji wystąpił następujący błąd wprowadź opis zdjęcia tutaj

Zamiast podawać dane wejściowe do programu wiersz po wierszu, spróbuj zamapować liczby całkowite rozdzielone spacjami na listę, używając map()metody.


0

Tworzę program, który czyta plik i jeśli pierwszy wiersz pliku nie jest pusty, odczytuje kolejne cztery wiersze. Obliczenia są wykonywane na tych liniach, a następnie odczytywany jest następny wiersz.

Coś takiego powinno działać:

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

Otrzymywałem podobne błędy, okazało się, że zestaw danych miał puste wartości, których Python nie mógł przekonwertować na liczbę całkowitą.


4
Czy mógłbyś rozwinąć nieco więcej przykładów, w jaki sposób OP może to rozwiązać?
fmendez

pusta wartość oznacza pustą, którą można przekształcić w łańcuch zmiennoprzecinkowy. Jeśli spróbujesz przekonwertować na zmiennoprzecinkowe, pojawi się również błąd
saravanan saminathan

0

Wpadłem w ten sam problem, gdy próbowałem użyć readlines () wewnątrz pętli for dla tego samego obiektu pliku ... Podejrzewam, że odpalenie readlines () wewnątrz readline () dla tego samego obiektu pliku spowodowało ten błąd.

Najlepszym rozwiązaniem może być seek (0), aby zresetować wskaźnik pliku lub obsłużyć warunek z ustawieniem niektórych flag, a następnie utworzyć nowy obiekt dla tego samego pliku, sprawdzając ustawiony warunek ....


0

Ostatnio natknąłem się na przypadek, w którym żadna z tych odpowiedzi nie zadziałała. Napotkałem dane CSV, w których były pomieszane bajty zerowe z danymi, a te bajty zerowe nie zostały usunięte. Zatem mój ciąg liczbowy po usunięciu składał się z takich bajtów:

\x00\x31\x00\x0d\x00

Aby temu przeciwdziałać:

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

... gdzie pola to lista wartości csv wynikających z podziału linii.


0

Wydaje się, że odczyty są czasem pustym ciągiem i oczywiście pojawia się błąd. Możesz dodać dodatkowe sprawdzenie do pętli while przed poleceniem int (odczyty), takim jak:

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

0

Trudno mi było ustalić właściwy powód, zdarza się, gdy nie czytamy poprawnie z pliku. musisz otworzyć plik i odczytać za pomocą metody readlines () jak poniżej:

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

Poprawia sformatowane dane wyjściowe


0

twoja odpowiedź rzuca błędy z powodu tej linii

readings = int(readings)
  1. Tutaj próbujesz przekonwertować ciąg na typ int, który nie jest base-10. możesz przekonwertować ciąg na int tylko wtedy, gdy jest on base-10, w przeciwnym razie wyrzuci ValueError, podając nieprawidłowy literał dla int () z base 10.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.