Jeg lager et program som leser en fil, og hvis den første linjen i filen ikke er tom, leser den de neste fire linjene. Beregninger utføres på disse linjene, og deretter leses neste linje. Hvis den linjen ikke er tom, fortsetter den. Imidlertid får jeg denne feilen:
ValueError: ugyldig literal for int() med base 10: ''.
Den leser den første linjen, men kan ikke konvertere den til et heltall.
Hva kan jeg gjøre for å løse dette problemet?
Koden:
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())
Pythonic måte å iterere over en fil og konvertere til int:
for line in open(fname):
if line.strip(): # line contains eol character(s)
n = int(line) # assuming single integer on each line
Det du'prøver å gjøre er litt mer komplisert, men fortsatt ikke rett frem:
h = open(fname)
for line in h:
if line.strip():
[int(next(h).strip()) for _ in range(4)] # list of integers
På denne måten behandler den 5 linjer om gangen. Bruk h.next()
i stedet for next(h)
før Python 2.6.
Grunnen til at du fikk ValueError
er at int
ikke kan konvertere en tom streng til et heltall. I dette tilfellet må du enten sjekke innholdet i strengen før konvertering, eller ekskludere en feil:
try:
int('')
except ValueError:
pass # or whatever
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
Det er et problem med den koden. readings
er en ny linje som leses fra filen - det er en streng. Derfor bør du ikke sammenligne den med 0. Videre kan du ikke bare konvertere den til et heltall med mindre du er sikker på at det faktisk er et heltall. For eksempel vil tomme linjer produsere feil her (som du sikkert har funnet ut).
Og hvorfor trenger du den globale tellingen? Det er absolutt dårlig design i Python.
Jeg oppretter et program som leser en fil og hvis den første linjen i filen ikke er tom, leser den de neste fire linjene. Beregninger utføres på disse linjene, og deretter blir den neste linjen lest.
Noe som dette bør fungere:
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