Sammmmmm
Sammmmmm

Reputation: 11

Python: continue on with the loop after an error occurs

So, I'm doing this assignment and I can't seem to figure out how to continue on to the next step. assignment output example

The file numbers.txt contains the following numbers all on separate lines (25, 15, 5, six, 35, one, 40).

My problem is that I can only print out one ValueError message (six), but I need to be able to print out both messages (invalid literal for int() with base 10: 'six\n', invalid literal for int() with base 10: 'one\n').

Since I can't get the codes to move on to the next iteration, my average only adds 25, 15, and 5. I've only been learning Python for a month so I don't know if there's a simple way to solve all these problems.

Below is the code I am working on.

def main():

while True:
    try:
        filename = input("Enter a file name: ")
        infile = open(filename, "r")

    except IOError:
        print("[Error No. 2] No such file or directory:", filename)
        continue # continue to next iteration

    else:
        break

data = infile.readline().strip()
numbers = data.split()
total = 0
count = 0
try:
    infile = open(filename, "r") #somehow without this, the first line won't print
    for line in infile:
        num = int(line)
        print(num)
        total += num
        count += 1
    print("The average is: ", total/count)

except ValueError as err:
    print(err)
finally:

    print(total/count)

main()

Upvotes: 0

Views: 416

Answers (4)

Ofek Glick
Ofek Glick

Reputation: 1003

You can repositioning your try statement in the second loop like so:

data = infile.readline().strip()
numbers = data.split()
total = 0
count = 0
infile = open(filename, "r") 
for line in infile:
    try:
        num = int(line)
        print(num)
        total += num
        count += 1
    except ValueError as err:
        print(err)
print("The average is: ", total/count)

This way, you won't exit the loop once you encounter an error message, and will simply print it and move on to the next line.

Upvotes: 1

msbet
msbet

Reputation: 56

You can set the try-except block inside the for loop which should produce the correct results.

data = infile.readline().strip()
numbers = data.split()
total = 0
count = 0

infile = open(filename, "r") 
for line in infile:
    try:
        num = int(line)
        total += num
        count += 1
    except ValueError as err:
        print(err)
print("The average is: ", total/count)

Upvotes: 0

5idneyD
5idneyD

Reputation: 202

You need to indent your while True as currently the main function is causing an error. You should also do an if line == ‘six’: line = 6

Upvotes: 0

balderman
balderman

Reputation: 23815

Try the below

# open the file using 'with' - it will make sure that the file will be closed
with open('input.txt') as f:
    values = []
    # read the lines into a list
    lines = [l.strip() for l in f.readlines()]
    for line in lines:
        # try to convert to int
        try:
            x = int(line)
            values.append(x)
        except ValueError as e:
            print(e)
    # calculate the average 
    print(f'Avg: {sum(values)/len(values)}')

input.txt

25
15
5
six
35
one
40

output

invalid literal for int() with base 10: 'six'
invalid literal for int() with base 10: 'one'
Avg: 24.0

Upvotes: 0

Related Questions