Subsections

File IO

Here is a simple example of file IO:
#Write a file
out_file = open("test.txt", "w")
out_file.write("This Text is going to out file\nLook at it and see\n")
out_file.close()

#Read a file
in_file = open("test.txt", "r")
text = in_file.read()
in_file.close()

print(text)
The output and the contents of the file test.txt are:
This Text is going to out file
Look at it and see
Notice that it wrote a file called test.txt in the directory that you ran the program from. The \n in the string tells Python to put a newline where it is.

A overview of file IO is:

  1. Get a file object with the open function.
  2. Read or write to the file object (depending on if you open it with a "r" or "w")
  3. Close it

The first step is to get a file object. The way to do this is to use the open function. The format is file_object = open(filename, mode) where file_object is the variable to put the file object, filename is a string with the filename, and mode is either "r" to read a file or "w" to write a file. Next the file objects functions can be called. The two most common functions are read and write. The write function adds a string to the end of the file. The read function reads the next thing in the file and returns it as a string. If no argument is given it will return the whole file (as done in the example).

Now here is a new version of the phone numbers program that we made earlier:

from __future__ import division, print_function
import sys
if sys.version_info.major == 2:
    input = raw_input


def print_numbers(numbers):
    print("Telephone Numbers:")
    for x in numbers:
        print("Name: ", x, " \tNumber: ", numbers[x])
    print()

def add_number(numbers, name, number):
    numbers[name] = number

def lookup_number(numbers, name):
    if name in numbers:
        return "The number is "+numbers[name]
    else:
        return name+" was not found"

def remove_number(numbers, name):
    if name in numbers:
        del numbers[name]
    else:
        print(name, " was not found")


def load_numbers(numbers, filename):
    in_file = open(filename, "r")
    while True:
        in_line = in_file.readline()
        if in_line == "":
            break
        in_line = in_line[:-1]
        [name, number] = in_line.split(",")
        numbers[name] = number
    in_file.close()

def save_numbers(numbers, filename):
    out_file = open(filename, "w")
    for x in numbers:
        out_file.write(x+","+numbers[x]+"\n")
    out_file.close()


def print_menu():
    print('1. Print Phone Numbers')
    print('2. Add a Phone Number')
    print('3. Remove a Phone Number')
    print('4. Lookup a Phone Number')
    print('5. Load numbers')
    print('6. Save numbers')
    print('7. Quit')
    print()

phone_list = {}
menu_choice = 0
print_menu()
while menu_choice != 7:
    menu_choice = int(input("Type in a number (1-7):"))
    if menu_choice == 1:
        print_numbers(phone_list)
    elif menu_choice == 2:
        print("Add Name and Number")
        name = input("Name:")
        phone = input("Number:")
        add_number(phone_list, name, phone)
    elif menu_choice == 3:
        print("Remove Name and Number")
        name = input("Name:")
        remove_number(phone_list, name)
    elif menu_choice == 4:
        print("Lookup Number")
        name = input("Name:")
        print(lookup_number(phone_list, name))
    elif menu_choice == 5:
        filename = input("Filename to load:")
        load_numbers(phone_list, filename)
    elif menu_choice == 6:
        filename = input("Filename to save:")
        save_numbers(phone_list, filename)
    elif menu_choice == 7:
        pass
    else:
        print_menu()
print("Goodbye")
Notice that it now includes saving and loading files. Here is some output of my running it twice:
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit

Type in a number (1-7):2
Add Name and Number
Name:Jill
Number:1234
Type in a number (1-7):2
Add Name and Number
Name:Fred
Number:4321
Type in a number (1-7):1
Telephone Numbers:
Name:  Jill     Number:  1234
Name:  Fred     Number:  4321

Type in a number (1-7):6
Filename to save:numbers.txt
Type in a number (1-7):7
Goodbye
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit

Type in a number (1-7):5
Filename to load:numbers.txt
Type in a number (1-7):1
Telephone Numbers:
Name:  Jill     Number:  1234
Name:  Fred     Number:  4321

Type in a number (1-7):7
Goodbye

The new portions of this program are:

def load_numbers(numbers, filename):
    in_file = open(filename, "r")
    while True:
        in_line = in_file.readline()
        if len(in_line) == 0:
            break
        in_line = in_line[:-1]
        [name, number] = in_line.split(",")
        numbers[name] = number
    in_file.close()
def save_numbers(numbers, filename):
    out_file = open(filename, "w")
    for x in numbers:
        out_file.write(x+","+numbers[x]+"\n")
    out_file.close()

First we will look at the save portion of the program. First it creates a file object with the command open(filename, "w"). Next it goes through and creates a line for each of the phone numbers with the command out_file.write(x+","+numbers[x]+"\n"). This writes out a line that contains the name, a comma, the number and follows it by a newline.

The loading portion is a little more complicated. It starts by getting a file object. Then it uses a while True: loop to keep looping until a break statement is encountered. Next it gets a line with the line in_line = in_file.readline(). The readline function will return a empty string (len(string) == 0) when the end of the file is reached. The if statement checks for this and breaks out of the while loop when that happens. Of course if the readline function did not return the newline at the end of the line there would be no way to tell if an empty string was an empty line or the end of the file so the newline is left in what readline returns. Hence we have to get rid of the newline. The line in_line = in_line[:-1] does this for us by dropping the last character. Next the line [name, number] = string.split(in_line, ",") splits the line at the comma into a name and a number. This is then added to the numbers dictionary.

Exercises

Now modify the grades program from section 11 so that is uses file IO to keep a record of the students.