ValueError: neteisingas int() literalas su baze 10: ''

Kuriu programą, kuri skaito failą ir, jei pirmoji failo eilutė nėra tuščia, skaito kitas keturias eilutes. Šiose eilutėse atliekami skaičiavimai, tada skaitoma kita eilutė. Jei ta eilutė nėra tuščia, skaitoma toliau. Tačiau gaunu šią klaidą:

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

Ji nuskaito pirmąją eilutę, bet negali jos paversti sveikuoju skaičiumi.

Ką galėčiau padaryti, kad išspręstumėte šią problemą?

Kodas:

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

Pitoniškas būdas iteruoti failą ir konvertuoti į int:

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

Tai, ką jūs bandote padaryti, yra šiek tiek sudėtingiau, bet vis tiek nėra paprasta:

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

Taip vienu metu apdorojamos 5 eilutės. Iki Python 2.6 versijos vietoj next(h) naudokite h.next().

Priežastis, dėl kurios jums įvyko ValueError, yra ta, kad int negali konvertuoti tuščios eilutės į sveikąjį skaičių. Tokiu atveju prieš konvertuodami turėtumėte arba patikrinti eilutės turinį, arba neįtraukti klaidos:

try:
   int('')
except ValueError:
   pass      # or whatever
Komentarai (5)
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

Su šiuo kodu yra problema. readings yra nauja eilutė, nuskaityta iš failo - tai eilutė. Todėl neturėtumėte jos lyginti su 0. Be to, negalite jos tiesiog konvertuoti į sveiką skaičių, nebent esate tikri, kad ji iš tikrųjų yra sveikas skaičius. Pavyzdžiui, tuščios eilutės čia sukels klaidų (kaip jau tikrai supratote).

Ir kam jums reikalingas globalus skaičius? Tai neabejotinai blogas Python dizainas.

Komentarai (0)

Aš kuriu programą, kuri skaito failą ir jei pirmoji failo eilutė nėra tuščia, ji perskaito kitas keturias eilutes. Skaičiavimai atliekami tose eilutėse ir tada skaitoma kita eilutė perskaitoma.

Kažkas panašaus turėtų veikti:

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
Komentarai (0)