Keywords: easytut

Далее: Что делать с вещами, далекими от идеала (обработка ошибок) Наверх: Курс языка Python для начинающих Назад: Строки возвращаются Содержание
В этой главе

- Упражнения

# Работа с файлами

Простой пример работы с файлами:

    #Запись в файл
    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()

    #Чтение с файла
    in_file = open("test.txt","r")
    text = in_file.read()
    in_file.close()

    print text,

Вывод и содержание файла text.txt:

    This Text is going to out file
    Look at it and see

Заметьте, что программа создала файл в той папке, где вы ее запустили. Символ `\n` в строке означает переход на следующую строку.

Обзор работы с файлами:

1. Создайте файловый объект с помощью функции `open`.
2. Считайте из файлового объекта или запишите в него (зависит от того, как он был открыт).
3. Закройте его.

Первый шаг – создание файлового объекта. Это делается с помощью функции `open`. Ее формат: `file_object = open(filename,mode)`, где `file_object` – переменная, которая будет содержать файловый объект, `filename` – строка с именем файла, а `mode` – либо `“r”` для чтения (read), либо `“w”` для записи (write). Далее могут вызываться функции для работы с файловыми объектами. Наиболее часто встречаются `read` и `write`. Функция `write` добавляет строку в конец файла. Функция `read` читает очередную часть файла и выдает ее как строку. Если ее использовать без аргумента, она выдает файл целиком (как в примере выше).

Приводим новую версию программы с номерами телефонов, представленную ранее:

    import string

    true = 1
    false = 0

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

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

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

    def remove_number(numbers,name):
        if numbers.has_key(name):
            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] = string.split(in_line,",")
            numbers[name] = number
        in_file.close()

    def save_numbers(numbers,filename):
        out_file = open(filename,"w")
        for x in numbers.keys():
            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 = 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 = raw_input("Name:")
            phone = raw_input("Number:")
            add_number(phone_list,name,phone)
        elif menu_choice == 3:
            print "Remove Name and Number"
            name = raw_input("Name:")
            remove_number(phone_list,name)
        elif menu_choice == 4:
            print "Lookup Number"
            name = raw_input("Name:")
            print lookup_number(phone_list,name)
        elif menu_choice == 5:
            filename = raw_input("Filename to load:")
            load_numbers(phone_list,filename)
        elif menu_choice == 6:
            filename = raw_input("Filename to save:")
            save_numbers(phone_list,filename)
        elif menu_choice == 7:
            pass
        else:
            print_menu()
    print "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):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

Новые части программы:

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

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

Сначала разберемся с частью программы, которая записывает в файл. Сначала программа создает файловый объект командой `open(filename,"w")`. Затем она создает строку для каждого номера телефона командой `out_file.write(x+","+numbers[x]+"\n")`. Записывается строка, содержащая имя, запятую, номер телефона и переход на новую строку.

Часть программы, читающая из файла, немного более сложная. Сначала она создает файловый объект. Затем она использует цикл `while 1`, продолжая итерации, пока не будет прервана командой `break`. Каждый раз она считывает строку командой `in_line = in_file.readline()`. Функция `readline` выдает пустую строку (len(string) == 0) когда она доходит до конца файла. Условие `if` отслеживает это и выходит из цикла `while` командой `break`, когда это происходит. Конечно, если бы функция `readline` не выдавала символ новой строки (“\n”) в конце текущей строки, было бы невозможно отличить пустую строку от конца файла, поэтому `readline` выдает символ новой строки в конце текущей строки. Нам необходимо от нее избавиться. Команда `in_line = in_line[:-1]` делает это, отбрасывая последний символ. Далее, команда `[name,number] = string.split(in_line,",")` делит строку по запятой на имя и номер телефона. Затем это добавляется в словарь numbers.

# Упражнения

Улучшите программу оценок главы 11, используя работу с файлами, добавив возможность сохранять в файле введенные данные и считывать их.

Далее: Что делать с вещами, далекими от идеала (обработка ошибок) Наверх: Курс языка Python для начинающих Назад: Строки возвращаются Содержание