day07.檔案操作/綜合應用【Python教程】

weixin_34019929發表於2018-05-16
5422542-3e950eddb6219445

day07.檔案操作/綜合應用【Python教程】

一、檔案操作介紹

<1>什麼是檔案

示例如下:

5422542-d3e98ee92872ccbd

<2>檔案的作用

大家應該聽說過一句話:“好記性不如爛筆頭”。

不僅人的大腦會遺忘事情,計算機也會如此,比如一個程式在執行過程中用了九牛二虎之力終於計算出了結果,試想一下如果不把這些資料存放起來,相比重啟電腦之後,“哭都沒地方哭了”

可見,在把資料儲存起來有做麼大的價值

使用檔案的目的:

就是把一些儲存存放起來,可以讓程式下一次執行的時候直接使用,而不必重新制作一份,省時省力

二、檔案的開啟與關閉

想一想:

如果想用word編寫一份簡歷,應該有哪些流程呢?

開啟word軟體,新建一個word檔案

寫入個人簡歷資訊

儲存檔案

關閉word軟體

同樣,在操作檔案的整體過程與使用word編寫一份簡歷的過程是很相似的

開啟檔案,或者新建立一個檔案

讀/寫資料

關閉檔案

<1>開啟檔案

在python,使用open函式,可以開啟一個已經存在的檔案,或者建立一個新檔案

open(檔名,訪問模式)

示例如下:

5422542-08af67b6873243de

說明:

訪問模式說明

r以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。

w開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。

a開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。

rb以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。

wb以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。

ab以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。

r+開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。

w+開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。

a+開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。

rb+以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。

wb+以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。

ab+以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

<2>關閉檔案

close( )

示例如下:

5422542-c05032bcacfc18fe

三、檔案的讀寫

<1>寫資料(write)

使用write()可以完成向檔案寫入資料

demo:

5422542-83b1efd8cfaa3ebe

執行現象:

5422542-4062fd4880ad6a2a

注意:

如果檔案不存在那麼建立,如果存在那麼就先清空,然後寫入資料

<2>讀資料(read)

使用read(num)可以從檔案中讀取資料,num表示要從檔案中讀取的資料的長度(單位是位元組),如果沒有傳入num,那麼就表示讀取檔案中所有的資料

demo:

5422542-7ed7119254507970

執行現象:

5422542-240cedb5644c9e60

注意:

如果open是開啟一個檔案,那麼可以不用謝開啟的模式,即只寫open('test.txt')

如果使用讀了多次,那麼後面讀取的資料是從上次讀完後的位置開始的

<3>讀資料(readlines)

就像read沒有引數時一樣,readlines可以按照行的方式把整個檔案中的內容進行一次性讀取,並且返回的是一個列表,其中每一行的資料為一個元素

5422542-87f49f881466e71f

執行現象:

5422542-f56514925b6fcf22

<4>讀資料(readline)

5422542-c573e574bfafeb53
5422542-4910dbbffbec18ab

想一想:

如果一個檔案很大,比如5G,試想應該怎樣把檔案的資料讀取到記憶體然後進行處理呢?

四、應用1:製作檔案的備份

任務描述

輸入檔案的名字,然後程式自動完成對檔案進行備份

5422542-5bf2079d0c38732d
5422542-277e89d83e061975

參考程式碼

5422542-42846b4d2d565bc1
5422542-139ae94c6e80756c

五、檔案的隨機讀寫

什麼是定位?

5422542-748c7927372b9181
5422542-550ba35dacde07b7
5422542-c5a51d383e1c68e6

<1>獲取當前讀寫的位置

在讀寫檔案的過程中,如果想知道當前的位置,可以使用tell()來獲取

5422542-99ffc7949056efcc

<2>定位到某個位置

如果在讀寫檔案的過程中,需要從另外一個位置進行操作的話,可以使用seek()

seek(offset, from)有2個引數

offset:偏移量

from:方向

0:表示檔案開頭

1:表示當前位置

2:表示檔案末尾

demo:把位置設定為:從檔案開頭,偏移5個位元組

5422542-44fbfaf6086c0700

demo:把位置設定為:離檔案末尾,3位元組處

5422542-87e8af4f7e52aceb

六、檔案的重新命名、刪除

有些時候,需要對檔案進行重新命名、刪除等一些操作,python的os模組中都有這麼功能

<1>檔案重新命名

os模組中的rename()可以完成對檔案的重新命名操作

rename(需要修改的檔名, 新的檔名)

5422542-2dc7d41e40ecd2d9

<2>刪除檔案

os模組中的remove()可以完成對檔案的刪除操作

remove(待刪除的檔名)

5422542-a07f5a55e62947bc

七、資料夾的相關操作

實際開發中,有時需要用程式的方式對資料夾進行一定的操作,比如建立、刪除等

就像對檔案操作需要os模組一樣,如果要操作資料夾,同樣需要os模組

<1>建立資料夾

5422542-e08e5f53807be872

<2>獲取當前目錄

5422542-17fa03d32db03686

<3>改變預設目錄

5422542-d594854fa5b7bff5

<4>獲取目錄列表

5422542-1a86f094fd2ee99d

<5>刪除資料夾

5422542-0049de186c46b1ec

八、應用:批量修改檔名

<1>執行過程演示

執行程式之前

5422542-ae65e08206a8d496

執行程式之後

5422542-a6a0f521d49ca932

<2>參考程式碼

5422542-4c3fac84e835b28e

九、綜合應用:學生管理系統(檔案版)

#用來儲存名片

card_infors = []

def print_menu():

    """完成列印功能選單"""

    print("="*50)

    print("   名片管理系統 V0.01")

    print(" 1. 新增一個新的名片")

    print(" 2. 刪除一個名片")

    print(" 3. 修改一個名片")

    print(" 4. 查詢一個名片")

    print(" 5. 顯示所有的名片")

    print(" 6. 儲存資訊")

    print(" 7. 退出系統")

    print("="*50)

def add_new_card_infor():

    """完成新增一個新的名片"""

    new_name = input("請輸入新的名字:")

    new_qq = input("請輸入新的QQ:")

    new_weixin = input("請輸入新的微信:")

    new_addr = input("請輸入新的住址:")

    #定義一個新的字典,用來儲存一個新的名片

    new_infor = {}

    new_infor['name'] = new_name

    new_infor['qq'] = new_qq

    new_infor['weixin'] = new_weixin

    new_infor['addr'] = new_addr

    #將一個字典,新增到列表中

    global card_infors

    card_infors.append(new_infor)

    #print(card_infors)# for test

def find_card_infor():

    """用來查詢一個名片"""

    global card_infors

    find_name = input("請輸入要查詢的姓名:")

    find_flag = 0#預設表示沒有找到

    for temp in card_infors:

        if find_name == temp["name"]:

            print("%s\t%s\t%s\t%s"%(temp['name'], temp['qq'], temp['weixin'], temp['addr']))

            find_flag=1#表示找到了

            break


    #判斷是否找到了

    if find_flag == 0:

        print("查無此人....")

def show_all_infor():

    """顯示所有的名片資訊"""

    global card_infors

    print("姓名\tQQ\t微信\t住址")

    for temp in card_infors:

        print("%s\t%s\t%s\t%s"%(temp['name'], temp['qq'], temp['weixin'], temp['addr']))

def save_2_file():

    """把已經新增的資訊儲存到檔案中"""

    f = open("backup.data", "w")

    f.write(str(card_infors))

    f.close()

def load_infor():

    global card_infors

    try:

        f = open("backup.data")

        card_infors = eval(f.read())

        f.close()

    except Exception:

        pass

def main():

    """完成對整個程式的控制"""

    #恢復(載入)之前的資料到程式中

    load_infor()

    #1. 列印功能提示

    print_menu()

    while True:

        #2. 獲取使用者的輸入

        num = int(input("請輸入操作序號:"))

        #3. 根據使用者的資料執行相應的功能

        if num==1:

            add_new_card_infor()

        elif num==2:

            pass

        elif num==3:

            pass

        elif num==4:

            find_card_infor()

        elif num==5:

            show_all_infor()

        elif num==6:

            save_2_file()

        elif num==7:

            break

        else:

            print("輸入有誤,請重新輸入")

        print("")

if __name__ == "__main__":

    #呼叫主函式

    main()

十一、作業

1. 讀取一個檔案,顯示除了以井號(#)開頭的行以外的所有行

2. 製作一個"密碼薄",其可以儲存一個網址(例如 www.javahelp.com.cn),和一個密碼(例如 123456),請編寫程式完成這個“密碼薄”的增刪改查功能,並且實現檔案儲存功能

5422542-054aa72edbf83995

相關文章