[2] Python文件讀寫

1. 概述

在本文中我會介紹關於在Python中如何處理各種錯誤異常。首先我們來看一下我們在上一篇中擬定的學習計劃,加粗體代表我們已經介紹的內容,斜體代表新增內容。

  • 異常處理
  • 文件的讀寫
  • 正則表達式
  • 操作文件和目錄
  • 深拷貝和淺拷貝
  • 面向對象的編程
  • 變數(擴展介紹)
  • 二進位、八進位和十六進位(包括ASCII)
  • 迭代、生成和遞歸
  • 高階函數map和zip
  • 匿名函數lambda
  • 圖像處理(運用numpy)

2. 文件的處理模式

文件的處理有三種模式,讀取、寫入和追加。

f = open(workfile) # 讀取文件(沒有模式參數默認為r)f = open(workfile, r) # r代表read,讀取文件,同上行f = open(workfile, w) # w代表write,寫入文件,如文件已存在,將覆蓋原文件f = open(workfile, a) # a代表append,往文件已有內容後添加f = open(workfile, r+) # 可讀可寫

其中workfile代表是文件名,如果單純的文件名的話,需要

  1. 如果有後綴名,則需要包含文件的後綴名;
  2. 單個文件名表示和Python代碼文件處於同級別目錄;
  3. 如果需要讀取不同目錄的文件,則需要具體的目錄(具體會在操作文件和目錄里說明),本文主要針對如何處理文件。

3. 讀取

首先我們建立一個文件,叫workfile:

Pycharm中右擊代碼文件所在文件夾,New > File,輸入文件名,在這裡我們選擇類型為Text。

This is the first lineThis is the second lineThis is the last line

如果需要對文件進行讀取:

f = open(workfile, r)print(f.read())f.close()

read()將會讀取整個文件,並返回一個字元串。注意在處理完文件後要及時關閉文件以釋放內存,用close(),文件被關閉後將無法對該變數名再次訪問,除非再打開一次。

f = open(workfile, r)print(f.readlines())f.close()

readlines()將會讀取整個文件,並返回一個列表,列表中每個元素都是一個字元串,每個元素內容對應一行內容,從上至下。

[This is the first line
, This is the second line
, This is the last line]

最後的
是換行符,Windows上會顯示
為換行符。

f = open(workfile, r)print(f.readline()) # This is the first linef.close()

這裡用readline()單個只讀取一行。

這裡要介紹一個指針模式,我們讀取文件時,代碼會追蹤之前的代碼讀到哪一行或者哪一個文字:

f = open(workfile, r)print(f.readline()) # This is the first lineprint(f.readlines()) # [This is the second line
, This is the last line]
print(f.read()) # (Nothing)f.close()

最後輸出的結果如注釋。可以看到,讀取了第一行後,再用readlines(),只能讀取未讀取部分的內容,read()同理。

4. 寫入

寫入也包含指針模式,如果寫入時沒有該文件,則會自動幫我們創建一個:

f = open(workfile, w)f.write(First Line
)f.write(Second Line
)f.write(Third Line
)f.close()

這麼寫下來,最後我們的workfile文件將會變成:

First LineSecond LineThird Line

可見其實寫入也會追蹤寫到哪裡。如果我們去掉每行後面的換行符

f = open(workfile, w)f.write(First Line)f.write(Second Line)f.write(Third Line)f.close()

最後文件長這樣:

First LineSecond LineThird Line

全部擠在一行,不過這也印證寫入時指針會隨時追蹤。

當然我們也能用下面的來代替write:

f.writelines([First
, Second
, Third
])

把內容一行一行存在一個列表裡,然後直接寫入,注意不要忘了換行符。

5. 追加

追加和寫入基本一樣,區別在於:

  1. 寫入是直接覆蓋原文件,追加是在原文件基礎上在後面追加內容;
  2. 追加模式是小寫字母a,寫入是w;

當然追加時若沒有要追加文件時便會自動創建一個空白文件。

6. with...as...語句

使用with...as...語句可以省去關閉文件f.close()這個步驟。

with open(workfile, r) as f: data_lines = f.readlines()

as後面,跟上想要把with後面的內容(也就是文件)賦予的變數的名字。此方法同樣適用於寫入和追加。

7. 二進位模式(簡要介紹)

在模式後加上b可以進入二進位讀取模式。比如

f = open(workfile, rb)f = open(workfile, wb)f = open(workfile, ab)f = open(workfile, rb+)

這樣我們就能對exe文件或者圖像文件進行處理。而文件中的讀取模式將以位元組(bytes)的模式來讀取。

8. 異常處理

由於讀取文件會存在很多不確定性,比如文件不存在、目錄不存在等錯誤,我們可以用前一章節的異常處理來進行甄別:

try: with open(workfile) as f: print(f.readlines())except FileNotFoundError: print(File does not exist!)

比如這樣,當然也有很多其它可能錯誤,這裡也不一一列舉,如果想要一下子處理所有可能錯誤,大家可以查看前一章。


推薦閱讀:

鍵盤鍵位修改及管理(Windows篇)
中美兩位 AI 大師的「巔峰對話」:為何 NLP 領域難以出現「獨角獸」? | 獨家
網格圖負權最短路
CS:APP Lab 2 - Bomb Lab - 帶彩蛋
linux忘記root密碼怎麼辦?

TAG:Python | 計算機科學 | 編程 |