ValueError: 10 tabanlı int () için geçersiz değişmez değer: ''


333

Bir dosyayı okuyan bir program oluşturuyorum ve dosyanın ilk satırı boş değilse, sonraki dört satırı okur. Hesaplamalar bu satırlarda yapılır ve bir sonraki satır okunur. Bu satır boş değilse devam eder. Ancak, bu hatayı alıyorum:

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

İlk satırı okuyor ama tamsayıya dönüştüremiyor.

Bu sorunu gidermek için ne yapabilirim?

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
with open(file_to_read, 'r') as infile:Orada kullanmayı düşünmelisiniz .
şeye rağmen

Yanıtlar:


311

Sadece kayıt için:

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

Beni buraya getirdiler ...

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

Kullanılmalı!


101
Gelecekte okuyucular için daha fazla netlik sağlamak amacıyla, int (float ('1.0')) int ('1.0') ValueError değerini attığında işe yarayacağını ekleyeceğim.
katyhuff

5
Bu, bu sorunun kabul edilen en iyi cevabı olmalıdır. Sayfayı neredeyse kapattım ve görmedim. Teşekkürler!
iTurki

2
soru int () olarak yanıt olarak int (float ('55063.000000')) ekleyin. Daha çok cevap verecek
Max

Bu neden oluyor? @katyhuff
Muhamed

7
Bu cevabın soru ile ilgisi yok gibi görünüyor. Soru, int()boş bir dize çağırdığınızda bir ValueError'ı nasıl önleyebileceğini sormaktır . "Bunun yerine float () kullan" sorunu çözmez. Hala bir ValueError alıyorsunuz.
Kevin

74

Python'da aşağıdakiler tamamen kabul edilebilir:

  • bir tamsayının dize olarak temsilini int
  • şamandıranın dize olarak temsilini float
  • bir tamsayının dize olarak temsilini float
  • yüzdürmek int
  • içine bir tamsayıyı geçirme float

Ama eğer bir olsun ValueErrorbir dize temsilini geçirirseniz şamandıra içine int, ya da bir şey bir dize temsilini ama (boş dize dahil) bir tamsayı. Bir kayan dizenin dize olarak temsilini bir int@ karakterine geçirmek istiyorsanız , @katyhuff yukarıda belirtildiği gibi, önce bir kayan noktaya, ardından bir tamsayıya dönüştürebilirsiniz:

>>> 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
Bu cevabın soru ile ilgisi yok gibi görünüyor. Soru, int()boş bir dize çağırdığınızda bir ValueError'ı nasıl önleyebileceğini sormaktır . "Bunun yerine float () kullan" sorunu çözmez. Hala bir ValueError alıyorsunuz.
Kevin

3
@Kevin Bu OP'nin sorusuna doğrudan cevap vermese de. Ancak bu sorunu olan ve umursamayan insanlara yardımcı olur int(float(x)). Bu hatayı ararken ortaya çıkan ilk soru budur.
Kerwin Sneijders

57

Bir dosya üzerinde yineleme ve int'e dönüştürme işleminin pitonik yolu:

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

Yapmaya çalıştığınız şey biraz daha karmaşık, ancak yine de basit değil:

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

Bu şekilde o anda 5 satır işler. Python 2.6'dan önce kullanmak h.next()yerine kullanın next(h).

Eğer vardı sebebi ValueErrornedeni inttam sayıya boş bir dize dönüştürmek olamaz. Bu durumda, dönüşümden önce dizenin içeriğini kontrol etmeniz veya bir hata hariç tutmanız gerekir:

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

4
Sizin denemeniz / hariç tutmanız, makul bir beklenti (boş / boş çizgi) ile tamsayı olmayan bir şey gibi kötü bir şey arasında ayrım yapmaz.
John Machin

ve neden bunları ayırt etmek istersiniz?
SilentGhost

3
çünkü biri makul bir şekilde beklenen ve cahil ama diğeri bir hatayı gösteriyor
John Machin

3
ve boş bir satır neden makul bir şekilde beklenen ve tamsayı olmayan bir çizgi?
SilentGhost

1
listenizin aslında dizgi tam sayılarının bir listesi olduğundan eminseniz bu iyi olur. Yapabileceğinizden emin değilsenizn = int(line) if line.is_integer() else int(float(line))
Mike Furlender

23

Etrafta bir iş buldum. Python, sayıyı bir kayan noktaya dönüştürür. Basitçe önce float çağrısı yapıp bunu int'ye dönüştürmek işe yarayacaktır: output = int(float(input))


11

Bunun nedeni, int'e bağımsız değişken olarak boş bir dize veya dize almanızdır. Boş olup olmadığını veya alfa karakter içerip içermediğini kontrol edin. Karakter içeriyorsa, o kısmı dikkate almayın.


2
Bu daha çok bir yoruma benziyor. Yeterli itibara sahip olduğunuzda, herhangi bir gönderi hakkında yorum yapabilirsiniz.
Joshua Drake

8

Bu hatayı almanızın nedeni, boşluk karakterini bir tam sayıya dönüştürmeye çalışmanızdır, bu da tamamen imkansız ve kısıtlıdır. Bu yüzden bu hatayı alıyorsunuz.resim açıklamasını buraya girin

Kodunuzu kontrol edin ve düzeltin, iyi çalışır


8

Eğer varsa

floatInString = '5.0'

Sen dönüştürebilirsiniz intilefloatInInt = int(float(floatInString))


3

Bu satırla ilgili bir sorununuz var:

while file_to_read != " ":

Bu boş bir dize bulamaz. Bir boşluktan oluşan bir dize bulur. Muhtemelen aradığınız bu değil.

Herkesin tavsiyelerini dinleyin. Bu çok deyimsel python kodu değildir ve doğrudan dosya üzerinde yineleme yaparsanız çok daha açık olur, ancak bu sorunun da dikkate değer olduğunu düşünüyorum.


3

Lütfen bu işlevi ( split()) basit bir dosyada test edin . Aynı sorunla karşı karşıyaydım ve bunun split()düzgün yazılmadığı (istisna işleme) olduğunu gördüm .


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

Bu kodla ilgili bir sorun var. readingsdosyadan okunan yeni bir satır - bir dize. Bu nedenle 0. Daha karşılaştırmak gerekir sen olmadıkça, sadece bir tamsayı dönüştürmek olamaz emin gerçekten bir onu . Örneğin, boş satırlar burada hatalar üretecektir (kesinlikle öğrendiğiniz gibi).

Ve neden küresel sayıma ihtiyacınız var? Bu kesinlikle Python'daki kötü tasarım.


1

Bu, boşlukla ayrılmış tamsayıları bir listeye eşlemeniz gerektiğinde de olabilir, ancak tamsayıları kullanarak satır satır girersiniz .input(). Örneğin HackerRank Bon- Appetit'te bu sorunu çözüyordum ve derlerken aşağıdaki hatayı aldım resim açıklamasını buraya girin

Bu nedenle, programa satır satır girdi vermek yerine, boşlukla ayrılmış tamsayıları map()yöntemi kullanarak bir listeye eşlemeye çalışın .


0

Bir dosyayı okuyan bir program oluşturuyorum ve dosyanın ilk satırı boş değilse, sonraki dört satırı okur. Hesaplamalar bu satırlarda yapılır ve bir sonraki satır okunur.

Böyle bir şey işe yaramalı:

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

Benzer hatalar alıyordum, veri kümesinin python'un tamsayıya dönüştüremediği boş değerleri olduğu ortaya çıktı.


4
OP'nin bunu nasıl çözebileceğine dair bazı örneklerle biraz daha ayrıntı verebilir misiniz?
fmendez

blank değeri, string float'a dönüştürülebilen boş anlamına gelir. Eğer şamandıra dönüştürmek çalışırsanız da hata gösterecektir
saravanan saminathan

0

Ben aynı dosya nesnesi için döngü için readlines () içinde çalışırken çalışırken aynı sorunu var ... Benim şüphem aynı dosya nesnesi için readline () içinde readling () ateşleme bu hataya neden oldu.

En iyi çözüm, dosya işaretleyicisini sıfırlamak için arama (0) veya bazı bayrağı ayarlayarak durum değiştirip daha sonra ayar koşulunu kontrol ederek aynı dosya için yeni nesne oluşturabilir.


0

Geçenlerde bu cevapların hiçbirinin işe yaramadığı bir davaya rastladım. Verilerle karıştırılmış boş baytların bulunduğu CSV verileriyle karşılaştım ve bu boş baytlar çıkarılmadı. Yani, benim sayısal dize, sıyırma sonra, böyle bayt oluşuyordu:

\x00\x31\x00\x0d\x00

Buna karşı koymak için:

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

... burada alanlar, çizginin bölünmesinden kaynaklanan csv değerlerinin bir listesidir.


0

Bu, okumaların bazen boş bir dize olduğu ve açıkça bir hatanın ortaya çıktığı gibi görünüyor. İnt (okumalar) komutundan önce while döngünüze fazladan bir kontrol ekleyebilirsiniz :

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

0

Asıl nedeni bulmakta zorlandım, dosyadan düzgün okumadığımızda olur. dosyayı açıp aşağıdaki gibi readlines () yöntemiyle okumalısınız:

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

Biçimlendirilmiş çıktıyı düzeltir


0

cevabınız bu satır yüzünden hata atıyor

readings = int(readings)
  1. Burada bir dizeyi base-10 olmayan int türüne dönüştürmeye çalışıyorsunuz. bir dizgeyi yalnızca base-10 ise int'e dönüştürebilirsiniz, aksi takdirde 10 ile int () için geçersiz değişmezi belirterek ValueError atar.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.