1. 程式人生 > >第031講:永久儲存:醃製一缸美味的泡菜

第031講:永久儲存:醃製一缸美味的泡菜

目錄

0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

測試題

0. pickle的實質是什麼?

1. 使用pickle的什麼方法儲存資料?

2. 使用pickle的什麼方法讀取資料?

3. 使用pickle能不能儲存為”*.txt”型別的檔案?

動動手

0. 編寫一個程式,這次要求使用pickle將檔案( ​ record.txt (1.1 KB, 下載次數: 3561) )裡的對話按照以下要求醃製成不同檔案(沒錯,是第29講的內容小改,考考你自己能寫出來嗎?):


0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

我們之前學習了檔案和檔案系統,我們知道從一個檔案裡面去讀取字串是非常簡單的,但是你如果要試圖讀取出數值的話,name就要多費點周折了,因為無論你是使用read()方法還是readline()方法,都是返回一個字串,如果我們希望從字串中取出數值的話,我們會使用int()或float()函式,把類似於1,2,3或者3.14的字串強制轉換為整型或者浮點型數值,我們一直在講儲存檔案,然而當你要儲存的資料像列表,字典,集合甚至是類的例項這些更加複雜的資料型別的時候,你就會舉手無措了,興許你可能會把這些都轉化為字串,然後再寫入到一個文字檔案中儲存起來,但是很快你就會發現,把這個過程反過來的時候,也就是從文字檔案中恢復資料物件,即把一個字串恢復成列表,字典,集合,類的例項的時候,你會發現這異常的困難,所幸的是,Python提供了一個標準的模組(pickle)使用這個模組,我們就可以輕鬆地將列表,字典,集合,類的例項這類複雜的型別轉換為二進位制檔案了。這個模組就是我們要學習的pickle模組了。

pickle就是泡菜、醃菜的意思,它幾乎可以把所有Python的物件轉換為二進位制的形式存放,這個過程我們稱之為 pickling(存放),從二進位制的形式轉換為物件的過程我們叫做 unpickling(讀取),舉例說明:

>>> import pickle
>>> my_list = [123, 3.14, '小甲魚', ['another list']]
>>> pickle_file = open('my_list.pkl', 'wb')   #這裡使用的pkl字尾名只是為了方便記憶,一定要用‘wb’的形式,可寫+二進位制
>>> pickle.dump(my_list, pickle_file)  #使用dump()方法寫入
>>> pickle_file.close()  #關閉檔案,我們會在資料夾看到my_list.pkl這個檔案
>>> 
>>> pickle_file = open('my_list.pkl', 'rb')   #對該檔案進行讀取,一定要用‘rb’的形式,二進位制讀取
>>> my_list2 = pickle.load(pickle_file)   ##使用load()方法讀取
>>> my_list2
[123, 3.14, '小甲魚', ['another list']]

以上就是今天學習的所有內容,但是我們發現,對於這樣一個小列表,進行儲存沒有多大作用,但是在實際的程式設計任務中,我們往往會遇到大量的複雜的列表,字典,這時候使用泡菜技術,程式碼就會顯得更加的優雅。

 

測試題

0. pickle的實質是什麼?

答:pickle的實質就是利用一些演算法將你的資料物件“醃製”成二進位制檔案,儲存在磁碟上,當然也可以放在資料庫或者通過網路傳輸到另一臺計算機上。8i6XL=2B

1. 使用pickle的什麼方法儲存資料?

答:pickle.dump(data, file) # 第一個引數是待儲存的資料物件,第二個引數是目標儲存的檔案物件,注意要先使用'wb'的模式open檔案哦^_^

2. 使用pickle的什麼方法讀取資料?

答:pickle.load(file) # 引數是目標儲存的檔案物件,注意要先使用'rb'的模式open檔案哦^_^ 

3. 使用pickle能不能儲存為”*.txt”型別的檔案?

答:可以,不過開啟後是亂碼,因為是以二進位制的模式寫入的。(例子詳見下方動動手第0題)

動動手

0. 編寫一個程式,這次要求使用pickle將檔案(  record.txt (1.1 KB, 下載次數: 3561) )裡的對話按照以下要求醃製成不同檔案(沒錯,是第29講的內容小改,考考你自己能寫出來嗎?):

  • 小甲魚的對話單獨儲存為boy_*.txt的檔案(去掉“小甲魚:”)
  • 小客服的對話單獨儲存為girl_*.txt的檔案(去掉“小客服:”)
  • 檔案中總共有三段對話,分別儲存為boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6個檔案(提示:檔案中不同的對話間已經使用“==========”分割)
import pickle

def save_file(boy, girl, count):
    file_name_boy = 'boy_' + str(count) + '.txt'
    file_name_girl = 'girl_' + str(count) + '.txt'

    boy_file = open(file_name_boy, 'wb') # 記得一定要加 b 吖
    girl_file = open(file_name_girl, 'wb') # 記得一定要加 b 吖

    pickle.dump(boy, boy_file)
    pickle.dump(girl, girl_file)

    boy_file.close()
    girl_file.close()

def split_file(file_name):
    count = 1
    boy = []
    girl = []

    f = open(file_name)

    for each_line in f:
        if each_line[:6] != '======':
            (role, line_spoken) = each_line.split(':', 1)
            if role == '小甲魚':
                boy.append(line_spoken)
            if role == '小客服':
                girl.append(line_spoken)
        else:
            save_file(boy, girl, count)

            boy = []
            girl = []
            count += 1 

    save_file(boy, girl, count)
    f.close()

split_file('record.txt')