Menu
Home
Log in / Register
 
Home arrow Computer Science arrow Data Structures and Algorithms with Python
< Prev   CONTENTS   Next >

1.10 Reading Multi-line Records from a File

Sometimes records of a file are not one per line. Records of a file may cross multiple lines. In that case, you can't use a for loop to read the file. You need a while loop instead. When you use a while loop, you need to be able to check a condition to see if you are done reading the file. But, to check the condition you must first try to read at least a little of a record. This is a kind of chicken and egg problem. Which came first, the chicken or the egg? Computer programmers have a name for this problem as it relates to reading from files. It is called the Loop and a Half Pattern. To use a while loop to read from a file, we need a loop and a half. The half comes before the while loop.

Consider the program we are writing in this chapter. Let's assume that the records of the file cross multiple lines. In fact, let's assume that we have variable length records. That is, the records of our file consist of one to five lines. The drawing commands will be exactly as they were before. But, instead of all the data for a record appearing on one line, we'll put each piece of data on its own separate line as shown in Sect. 1.10.1.

1.10.1 A Text File with Multiple Line Records

1 beginfill

2 black

3 circle

4 20

5 1

6 black

7 endfill

8 penup

9 goto

10 120

11 0

12 1

13 black

14 pendown

15 beginfill

16 black

17 circle

18 20

19 1

20 black

21 endfill

22 penup

23 goto

24 150

25 40

26 1

27 black

28 pendown

29 beginfill

30 yellow

31 goto

32 -30

33 40

34 1

35 black

36 goto

37 -30

38 70

39 1

40 black

41 goto

42 60

43 70

44 1

45 black

46 goto

47 60

48 100

49 1

50 black

51 goto

52 90

53 100

54 1

55 black

56 goto

57 115

58 70

59 1

60 black

61 goto

62 150

63 70

64 1

65 black

66 goto

67 150

68 40

69 1

70 black

71 endfill

To read a file as shown in Sect. 1.10.1 we write our loop and a half to read the first line of each record and then check that line (i.e. the graphics command) so we know how many more lines to read. The code in Sect. 1.10.2 uses a while loop to read these variable length records.

1.10.2 Reading and Processing Multi-line Records

1 import turtle

2

3 def main():

4 filename = input("Please enter drawing filename: ")

5

6 t = turtle.Turtle()

7 screen = t.getscreen()

8

9 file = open(filename, "r")

10

11 # Here we have the half a loop to get things started. Reading our first

12 # graphics command here lets us determine if the file is empty or not.

13 command = file.readline().strip()

14

15 # If the command is empty, then there are no more commands left in the file.

16 while command != "":

17

18 # Now we must read the rest of the record and then process it. Because

19 # records are variable length, we'll use an if-elif to determine which

20 # type of record it is and then we'll read and process the record.

21

22 if command == "goto":

23 x = float(file.readline())

24 y = float(file.readline())

25 width = float(file.readline())

26 color = file.readline().strip()

27 t.width(width)

28 t.pencolor(color)

29 t.goto(x,y)

30 elif command == "circle":

31 radius = float(file.readline())

32 width = float(file.readline())

33 color = file.readline().strip()

34 t.width(width)

35 t.pencolor(color)

36 t.circle(radius)

37 elif command == "beginfill":

38 color = file.readline().strip()

39 t.fillcolor(color)

40 t.begin_fill()

41 elif command == "endfill":

42 t.end_fill()

43 elif command == "penup":

44 t.penup()

45 elif command == "pendown":

46 t.pendown()

47 else:

48 print("Unknown command found in file:",command)

49

50 # This is still inside the while loop. We must (attempt to) read

51 # the next command from the file. If the read succeeds, then command

52 # will not be the empty string and the loop will be repeated. If

53 # command is empty it is because there were no more commands in the

54 # file and the while loop will terminate.

55 command = file.readline().strip()

56

57

58 # close the file

59 file.close()

60

61 t.ht()

62 screen.exitonclick()

63 print("Program Execution Completed.")

64

65 if name == " main ":

66 main()

When reading a file with multi-line records, a while loop is needed. Notice that on line 13 the first line of the first record is read prior to the while loop. For the body of the while loop to execute, the condition must be tested prior to executing the loop. Reading a line prior to the while loop is necessary so we can check to see if the file is empty or not. The first line of every other record is read at the end of the while loop on line 55. This is the loop and a half pattern. The first line of the first record is read before the while loop while the first line of every other record is read inside the while loop just before the end. When the condition becomes false, the while loop terminates.

The abstract pattern for reading multi-line records from a file is shown in Sect. 1.10.3. There are certainly other forms of this pattern that can be used, but memorizing this pattern is worth-while since the pattern will work using pretty much any programming language.

1.10.3 Pattern for Reading Multi-line Records from a File

1 # First the file must be opened

2 file = open(filename, "r")

3

4 # Read the first line of the first record in the file. Of course, firstLine should be

5 # called something that makes sense in your program.

6 firstLine = file.readline().strip()

7

8 while firstLine != "":

9 # Read the rest of the record

10 secondLine = file.readline().strip()

11 thirdLine = file.readline().strip()

12 # ...

13

14 # Then process the record. This will be determined by the program you are

15 # writing.

16 print(firstLine, secondLine, thirdLine)

17

18 # Finally, finish the loop by reading the first line of the next record to

19 # set up for the next iteration of the loop.

20 firstLine = file.readline().strip()

21

22 # It's a good idea to close the file, but it will be automatically closed when your

23 # program terminates.

24 file.close()

 
Found a mistake? Please highlight the word and press Shift + Enter  
< Prev   CONTENTS   Next >
 
Subjects
Accounting
Business & Finance
Communication
Computer Science
Economics
Education
Engineering
Environment
Geography
Health
History
Language & Literature
Law
Management
Marketing
Philosophy
Political science
Psychology
Religion
Sociology
Travel