#Запись в файл 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 в строке означает переход на следующую строку.
Обзор работы с файлами:
Первый шаг – создание файлового объекта. Это делается с помощью функции 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, используя работу с файлами, добавив возможность сохранять в файле введенные данные и считывать их.