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
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.
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