Cannot read every character from a file in python

This is from project euler question 18. I used this method to read from the file "18.txt" This is my code-

f=open("18.txt","r")
grid1=[]
grid=[grid1]
no=0
while f.read(1):
   print(f.read(1))

but it doesn't print every number from the file and skips alternative numbers.

18.txt contents-

75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

1 answer

  • answered 2018-11-12 19:33 Martijn Pieters

    You are calling f.read(1) twice each iteration, once in while f.read(1) and again for print(f.read(1)). You only print the second character, so you will only see half of the data being read.

    If you want to see each character printed, call f.read(1) just once each iteration. Store the result in a variable and test against the variable, then print the variable:

    char = f.read(1)
    while char:
        print(char)
        char = f.read(1)
    

    You can avoid having to assign to char before the loop if you used while True: and break out when f.read(1) doesn't return data:

    while True:
        char = f.read(1)
        if not char:
            break
        print(char)
    

    or you can use the iter() function with a sentinel:

    for char in iter(lambda: f.read(1), ''):
        print(char)
    

    If you wanted to read the numbers from the file, don't use f.read(1). Just loop over the file and split each line on whitespace:

    with open("18.txt") as f:
        for line in f:
            print(line.split())
    

    You probably want to convert the text to integers too, and build up your grid list of lists:

    grid = []
    with open("18.txt") as f:
        for line in f:
            values = [int(v) for v in line.split()]
            grid.append(values)