Luon ohjelmaa, joka lukee tiedoston ja jos tiedoston ensimmäinen rivi ei ole tyhjä, se lukee neljä seuraavaa riviä. Näille riveille suoritetaan laskutoimitukset ja sitten luetaan seuraava rivi. Jos kyseinen rivi ei ole tyhjä, se jatkaa. Saan kuitenkin tämän virheen:
''.ValueError: invalid literal for int() with base 10: ''.
Se lukee ensimmäisen rivin, mutta ei voi muuntaa sitä kokonaisluvuksi.
Miten voin korjata tämän ongelman?
Koodi:
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())
Pythoninen tapa iteroida tiedoston yli ja muuntaa se int:ksi:
for line in open(fname):
if line.strip(): # line contains eol character(s)
n = int(line) # assuming single integer on each line
Se, mitä yrität tehdä, on hieman monimutkaisempaa, mutta ei silti suoraviivaista:
h = open(fname)
for line in h:
if line.strip():
[int(next(h).strip()) for _ in range(4)] # list of integers
Näin se käsittelee 5 riviä kerrallaan. Käytä h.next()
ennen Python 2.6:aa next(h)
:n sijasta.
Syy siihen, että sinulla oli ValueError
, on se, että int
ei voi muuntaa tyhjää merkkijonoa kokonaisluvuksi. Tässä tapauksessa sinun on joko tarkistettava merkkijonon sisältö ennen muuntamista tai otettava huomioon virhe:
try:
int('')
except ValueError:
pass # or whatever
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
Tuossa koodissa on ongelma. readings
on uusi tiedostosta luettu rivi - se on merkkijono. Siksi sitä ei pitäisi verrata arvoon 0. Lisäksi sitä ei voi muuntaa kokonaisluvuksi, ellei ole varmoja siitä, että se on kokonaisluku. Esimerkiksi tyhjät rivit tuottavat virheitä (kuten olet varmasti huomannut).
Ja miksi tarvitset globaalin lukumäärän? Se on varmasti huonoa suunnittelua Pythonissa.
Olen luomassa ohjelmaa, joka lukee tiedoston tiedoston ja jos tiedoston ensimmäinen rivi ei ole tyhjä, se lukee neljä seuraavaa riviä. rivit. Laskelmat suoritetaan näillä riveillä, ja sitten seuraava rivi on luetaan.
Jotain tämän kaltaista pitäisi toimia:
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