讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 22.7 寫文件 >

22.7 寫文件

如果你想更持久地存儲程序的信息,可以看著屏幕,把這些信息抄寫在紙上。不過這樣根本無法體現出計算機的作用!

比較好的做法是把信息保存在硬盤上,這樣一來,即使程序不再運行(即計算機已經關機),你的數據仍然能保留下來,供以後使用。其實你早已經這麼做了。每次保存學校作業、圖片、歌曲或者 Python 程序時,實際上都是將它們存儲到硬盤上。

從前的美好時光

在我們那個年代,只有紙!沒有顯示器、打印機,甚至沒有鍵盤。要通過在卡片上打孔來「寫」代碼。然後把這疊卡片塞進一個大機器裡,它會把這些打孔卡轉換成計算機能夠理解的電子信號。有時需要花幾天時間才能得到一個答案。唉,可真是又費勁又麻煩!

老式計算機打孔卡

前面已經提到,在文件中添加內容有兩種方法。

  • 寫——這表示開始新文件,或者覆蓋現有的文件。

  • 追加——這表示增加到現有的文件,保留原來已有的內容。

要寫文件或追加文件,首先必須打開文件。像前面一樣要使用 open 函數,只不過第二個參數有所不同。

  • 要讀文件,需要使用 \'r\' 作為文件模式:

    my_file = open(\'new_notes.txt\', \'r\')  
  • 要寫文件,需要使用 \'w\' 作為文件模式:

    my_file = open(\'new_notes.txt\', \'w\')  
  • 要追加文件,需要使用 \'a\' 作為文件模式:

    my_file = open(\'notes.txt\', \'a\')  

如果使用 \'a\' 表示追加模式,文件名必須是硬盤上某個已經存在的文件的名字,否則你會得到一條錯誤消息。這是因為,追加是指增加到一個現有的文件。

卡特又說對了!如果使用 \'w\' 表示寫模式,會有兩種可能:

  • 如果文件已經存在,文件中的所有內容都會丟失,替換為現在寫入的內容;

  • 如果文件不存在,會創建一個同名的新文件,你寫的所有內容會被放入這個新文件中。

下面來看一些例子。

追加到文件

首先,還是使用前面創建的 notes.txt 文件,為它追加一些內容。下面增加一行「Spend allowance」。完成 readlines 例子時如果你仔細觀察,可能已經注意到最後一行末尾沒有 n,也就是說沒有換行符。所以現在需要增加一個換行符,然後再增加我們的新字符串。要把字符串寫入文件,需要使用 write 方法,如代碼清單 22-3 所示。

代碼清單 22-3 使用追加模式

讀文件時,我們說過一旦完成就應當關閉文件。這一點在寫文件時更為重要,寫文件完成時一定要使用 close。這是因為,只有使用 close 關閉文件,你所做的修改才會真正保存到文件中。

運行代碼清單 22-3 中的程序之後,用「記事本」(或者任何其他文本編輯器)打開 notes.txt,看看裡面的內容。記住,看完後一定要關閉「記事本」。

寫文件

現在來看一個使用寫模式來寫文件的例子。我們將打開一個目前硬盤上還沒有的文件。鍵入代碼清單 22-4 中的程序,然後運行。

代碼清單 22-4 對一個新文件使用寫模式

new_file = open(\"my_new_notes.txt\", \'w\')new_file.write(\"Eat suppern\")new_file.write(\"Play soccern\")new_file.write(\"Go to bed\")new_file.close  

怎麼知道這個程序是否起作用呢?檢查保存這個程序(代碼清單 22-4)的文件夾,應該能看到一個名為 my_new_notes.txt 的文件。可以在「記事本」中打開這個文件,看看裡面有什麼。應該能看到:

Eat supperPlay soccerGo to bed  

你利用這個程序創建了一個文本文件,並在這個文件中存儲了一些文本。這個文件存放在硬盤上,只要硬盤沒有壞,它就會一直在那裡,除非你刪除了它。這樣一來我們就得到了一種方法,可以持久地存儲程序的數據。現在你的程序就能在這個世界上(或者至少在你的硬盤上)留下永久的印記了。如果要在程序停止和計算機關機時保留一些信息,都可以放在文件中。

下面來看如果對硬盤上已有的一個文件使用寫模式會發生什麼。還記得那個 notes.txt 文件嗎?如果運行過代碼清單 22-3 中的程序,這個文件現在是這樣的:

Wash the carMake my bedCollect allowanceSpend allowance  

下面用寫模式打開這個文件,並寫入內容,看看會發生什麼。代碼清單 22-5 給出了相應的代碼。

代碼清單 22-5 對一個現有文件使用寫模式

the_file = open(\'notes.txt\', \'w\')the_file.write(\"Wake upn\")the_file.write(\"Watch cartoons\")the_file.close  

運行這個代碼,然後在「記事本」中打開 notes.txt,看看其中包含什麼內容。應該會看到:

Wake upWatch cartoons  

notes.txt 原先的內容都不見了,已經被代碼清單 22-5 程序中的新內容所取代。

使用 print 寫文件

上一節中,我們使用了 write 來寫文件,還可以用 print 寫文件。仍然要以寫模式或追加模式打開文件,不過打開文件後可以使用 print 寫文件,就像這樣:

my_file = open(\"new_file.txt\", \'w\')print >> my_file, \"Hello there, neighbor!\"my_file.close  

這裡的兩個 > 符號(有時稱為山形符號)告訴 print 要把它的輸出發送到一個文件中而不是屏幕上。這稱為重定向(redirecting)輸出。

有時使用 printwrite 更方便,因為 print 還會額外完成一些工作,比如把數字自動轉換為字符串等。如果要在文件中放入文本,你可以使用 print,也可以使用 write