跳轉到內容

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" 用於寫入檔案(以及其他一些我們將跳過的選項)。接下來可以呼叫檔案物件的函式。兩個最常見的函式是 readwritewrite 函式在檔案末尾新增一個字串。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()


華夏公益教科書