Python 2.6 非程式設計師教程/檔案 I/O
這是一個簡單的檔案 I/O(輸入/輸出)示例
# Write a file
out_file = open("test.txt", "w")
out_file.write("This Text is going to out file\nLook at it and see!")
out_file.close()
# Read a file
in_file = open("test.txt", "r")
text = in_file.read()
in_file.close()
print text
輸出和檔案test.txt的內容是
This Text is going to out file Look at it and see!
請注意,它在您執行程式的目錄中建立了一個名為test.txt的檔案。字串中的\n告訴 Python 在該位置放置一個新行。
檔案 I/O 的概述是
- 使用
open函式獲取檔案物件。 - 讀取或寫入檔案物件(取決於它是如何開啟的)
- 關閉它
第一步是獲取檔案物件。方法是使用open函式。格式為file_object = open(filename, mode),其中file_object是放置檔案物件的變數,filename是包含檔名的字串,mode是"r"以讀取檔案或"w"以寫入檔案(以及我們將在此處跳過的其他一些)。接下來可以呼叫檔案物件的函式。兩個最常用的函式是read和write。write函式將字串新增到檔案的末尾。read函式讀取檔案中的下一項並將其作為字串返回。如果沒有給出引數,它將返回整個檔案(如示例中所示)。
現在,這是我們之前編寫的電話號碼程式的新版本
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 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")
for in_line in in_file:
in_line = in_line.rstrip('\n') #Eliminate end of line or enter
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.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 True:
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:
break
else:
print_menu()
print "Goodbye"
請注意,它現在包括儲存和載入檔案。以下是我的執行兩次的一些輸出
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
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 True:
in_line = in_file.readline()
if not 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.keys():
out_file.write(x + "," + numbers[x] + "\n")
out_file.close()
首先,我們將檢視程式的儲存部分。首先,它使用命令open(filename, "w")建立一個檔案物件。接下來,它遍歷併為每個電話號碼建立一個行,使用命令out_file.write(x + "," + numbers[x] + "\n")。這將寫出一行,其中包含姓名、逗號、號碼,並在後面加上換行符。
載入部分稍微複雜一些。它首先獲取檔案物件。然後,它使用while True:迴圈一直迴圈,直到遇到break語句。接下來,它使用行in_line = in_file.readline()獲取一行。當到達檔案末尾時,readline函式將返回一個空字串。if語句檢查此情況,並在發生這種情況時從while迴圈中break。當然,如果readline函式沒有在行的末尾返回換行符,則無法判斷空字串是空行還是檔案末尾,因此換行符保留在readline返回的內容中。因此,我們必須刪除換行符。行in_line = in_line[:-1]透過刪除最後一個字元來做到這一點。接下來,行name, number = in_line.split(",")在逗號處將行拆分為姓名和號碼。然後將其新增到numbers字典中。
現在修改第 字典 節中的成績程式,以便它使用檔案 I/O 來記錄學生資訊。
現在修改第 字典 節中的成績程式,以便它使用檔案 I/O 來記錄學生資訊。
assignments = ['hw ch 1', 'hw ch 2', 'quiz ', 'hw ch 3', 'test']
students = { }
def load_grades(gradesfile):
inputfile = open(gradesfile, "r")
grades = [ ]
while True:
student_and_grade = inputfile.readline()
student_and_grade = student_and_grade[:-1]
if not student_and_grade:
break
else:
studentname, studentgrades = student_and_grade.split(",")
studentgrades = studentgrades.split(" ")
students[studentname] = studentgrades
inputfile.close()
print "Grades loaded."
def save_grades(gradesfile):
outputfile = open(gradesfile, "w")
for i in students.keys():
outputfile.write(i + ",")
for x in students[i]:
outputfile.write(x + ",") #added missing comma
outputfile.write("\n")
outputfile.close()
print "Grades saved."
def print_menu():
print "1. Add student"
print "2. Remove student"
print "3. Load grades"
print "4. Record grade"
print "5. Print grades"
print "6. Save grades"
print "7. Print Menu"
print "9. Quit"
def print_all_grades():
keys = students.keys()
if keys:
keys.sort()
print '\t',
for i in range(len(assignments)):
print assignments[i], '\t',
print
for x in keys:
print x, '\t',
grades = students[x]
print_grades(grades)
else:
print "There are no grades to print."
def print_grades(grades):
for i in range(len(grades)):
print grades[i], '\t',
print
print_menu()
menu_choice = 0
while menu_choice != 9:
print
menu_choice = input("Menu Choice: ")
if menu_choice == 1:
name = raw_input("Student to add: ")
students[name] = [0] * len(assignments)
elif menu_choice == 2:
name = raw_input("Student to remove: ")
if name in students:
del students[name]
else:
print "Student:", name, "not found"
elif menu_choice == 3:
gradesfile = raw_input("Load grades from which file? ")
load_grades(gradesfile)
elif menu_choice == 4:
print "Record Grade"
name = raw_input("Student: ")
if name in students:
grades = students[name]
print "Type in the number of the grade to record"
print "Type a 0 (zero) to exit"
for i in range(len(assignments)):
print i + 1, assignments[i], '\t',
print
print_grades(grades)
which = 1234
while which != -1:
which = input("Change which Grade: ")
which = which - 1
if 0 <= which < len(grades):
grade = raw_input("Grade: ") # Change from input() to raw_input() to avoid an error when saving
grades[which] = grade
elif which != -1:
print "Invalid Grade Number"
else:
print "Student not found"
elif menu_choice == 5:
print_all_grades()
elif menu_choice == 6:
gradesfile = raw_input("Save grades to which file? ")
save_grades(gradesfile)
elif menu_choice != 9:
print_menu()