next up previous contents
Далее: Что делать с вещами, далекими от идеала (обработка ошибок) Наверх: Курс языка 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, используя работу с файлами, добавив возможность сохранять в файле введенные данные и считывать их.


next up previous contents
Далее: Что делать с вещами, далекими от идеала (обработка ошибок) Наверх: Курс языка Python для начинающих Назад: Строки возвращаются   Содержание
Джош Коглиати jjc@honors.montana.edu Версия Wikibooks: Курс языка Python Для начинающих на Wikibooks