python 歷險記(三)— python 的經常使用文件操做

前言

上篇文章 中,全面講解了 python 3 中 的面向對象,今天我會繼續探險,去掌握 python 3 中的文件操做, let's go 讓咱們出發吧!python

文件

什麼是文件?

一談到文件,就會涉及到一個的重要的概念,持久化 。什麼是持久化?json

持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。通俗的講,就是瞬時數據(好比內存中的數據,是不能永久保存的)持久化爲持久數據。 ——來源於百度百科緩存

因而可知,持久化數據就是在程序運行結束後或者斷電後再開機,還繼續存在的數據。而文件就是最典型的表現形式。那什麼是文件呢?函數

文件就是存儲在如硬盤,光盤這樣的非易失媒介上的信息序列。像內存,在關機或掉電後,信息就所有丟失了,文件固然不會存儲在它上面。學習

當咱們想要讀或者寫文件時,就得先打開(open) 文件才能夠,而當讀寫完成的時候,也要儘可能將其關閉(close),這樣纔可以釋放它佔用的系統資源啊。操作系統

如何在 python 中打開文件?

使用內置函數 open 就能夠打開文件。先來看下 python 中對 open 函數的定義3d

file object = open(file_name [, access_mode][, buffering])

參數定義以下code

  • access_mode 表示文件模式。常見的模式有讀模式,寫模式,追加模式等。這個參數是可選的,若是不填,默認就是讀模式。具體的文件模式列表在下面表格中列出。
  • buffering 緩存標誌
    • 若是不填,默認值爲 0
    • 值爲 1 表示行緩存
    • 值 > 1 則表明緩衝區的大小(單位是字節)
    • 值 < 0 表示使用默認緩存區的大小
  • file_name 表示要訪問的文件路徑名稱,能夠是相對路徑,也能夠是絕對路徑。

具體的文件模式 access_mode 參數表以下xml

功能描述
w 寫模式
r 讀模式
x 寫模式,建立一個文件,若是文件已存在,則報錯
a 追加模式
b 二進制模式(可與其餘模式結合使用)
+ 讀/寫模式(可與其餘模式結合使用)

其中 b 或者 + 可與其餘模式結合使用須要說明下:

  • rb 就表示讀取一個二進制文件
  • w+ 表示對打開的文件可讀可寫
  • wb+ 則表示對二進制文件可讀可寫,若是模式中不加 b則默認表示文本文件

調用 open 函數後返回的是什麼對象呢?可以從這個對象中獲取什麼信息和執行什麼操做呢?來看下一節

python 文件對象有哪些屬性?

調用 open 函數後返回的是一個文件句柄,這個句柄中包含許多文件相關的屬性,具體以下面表格所示

屬性 功能描述
file.closed 文件是否已關閉,是則返回 true
file.mode 打開文件時使用的模式
file.name 文件名稱

來看一個例子

f = open('test.py', 'r+')

# 文件名稱.
print ("File name: ", f.name) # test.py
# 文件是否已關閉
print ("File state: ", f.closed) # False
# 文件打開時的模式
print ("Opening mode: ", f.mode) # r+

打開文件後,最多見的操做就是讀文件和寫文件了,先來看讀文件

如何讀文件?

在讀取文件時, 最經常使用的方法就是 read()readlines() 兩個方法,在操做結束後都要調用 close() 方法關閉文件,釋放資源。

先來看 read() 方法

read()

打開文件後,

  • 調用 read(size) 方法能夠一次讀取 size 字節的數據

  • 若是read()方法中沒有參數能夠一次將文件內容所有讀入到內存中

來看一個例子,假設有一個文件名稱爲 a.txt 內容爲

Good morning, everyone!
Good morning, my student!

先來讀取前 4 個字母

try:
  f = open('a.txt', 'r')
  print(f.read(4)) # Good
finally:
  if f:
    f.close()

上面代碼爲何要用 try ... finally 包裹呢?

這是由於文件操做極可能出現 IO 異常的狀況,須要使用 try ... finally 包住,即便出現異常也能保證 close() 方法可以正常調用。

其實還有更簡潔的寫法,就是使用 with 語句,它就是一個語法糖,一下就把 try ... finally 的活都幹了。來感覺下它的威力

with open('a.txt', 'r') as f:
  print(f.read(4)) # Good

readline()

對於文本文件來講,若是比較大,使用 readline() 方法則更爲合理,能夠一次讀取一行內容。

with open('a.txt', 'r') as f:
  print(f.readline()) # Good morning teacher!

若是一次想返回多列文本,可使用 readlines() 方法,它會返回一個列表。

with open('a.txt', 'r') as f:
  print(f.readlines()) # ['Good morning teacher!\n', 'Good morning, my student!']

如何寫文件?

寫文件和讀文件操做很是相似,它們的區別就在於:

  • 調用 open 方法打開文件時,文件模式須要包含 wa或者 x

注意, 使用 w 模式打開文件後,執行寫入操做,若是文件已經存在,則會將以前的文件內容所有覆蓋,以前的數據內容就丟失了啊。若是不想覆蓋,仍是使用 a 模式打開吧。

調用什麼方法能夠寫文件呢? write()方法,調用成功後,會返回寫入文件的字符長度。

來看一個例子

with open('a.txt', 'w') as f:
  f.write('I am line 1\n')
  f.write('I am line 2\n')

上面代碼中,爲何要加 \n 呢?這是用來分行的,要否則都擠在一行了。

注意,這裏若是不使用 with 語法糖,也必定要顯式的調用使用 close 方法。這不只僅是由於釋放資源的緣由:在調用 write() 方法時,操做系統不會馬上將數據寫入到文件中,而是先在內存中緩存,等到空閒時再寫入文件,最後使用 close() 方法纔會將數據完整的寫入到文件中。

固然,顯式調用 flush() 方法也能夠將數據當即寫入文件中。綜合比較,仍是推薦使用 with 的方式,優雅且完善。

如何操做文件和目錄?

除了對文件讀和寫以外,還會常常用到如獲取文件路徑,查看文件大小,重命名,刪除文件等文件或目錄操做。這些操做應該調用哪些方法來完成呢?

強大的 os 模塊

剛開始接觸 os 模塊,就被它強大的 API 列表給震撼了,使用這個模塊幾乎能夠完成全部的平常文件和目錄操做。爲方便之後查詢,我專門將這些經常使用的操做分門別類,作了一個思惟導圖。一塊兒來看下。

os 模塊 API 思惟導圖

上圖中只給出了最簡單的功能介紹,若是想要深刻了解具體的方法使用,可參考 python 3.6 os 模塊官方地址

學習有時候就是這樣,API 太多根本記不住,也沒有必要徹底記住,只要常常概括整理,知道要使用的操做在什麼地方,叫什麼名字,用到的時候去查就能夠了。

shutil 模塊— High-level file operations

除了 os 模塊,還有一個很是有用的模塊 shutil ,它的定位是針對多個文件的高級文件操做(High-level file operations)。相比而言, os 模塊大可能是對單個文件而言的嘍。下面經過幾個經常使用的操做來感覺下:

  • 複製文件夾 shutil.copytree('olddir', 'newdir')
    • 注意, 參數olddir ,newdir 只能是目錄,並且 newdir 這個目錄不存在才能夠
  • 移動文件或目錄 shutil.move('oldpath','newpath')
  • 刪除目錄 shutil.rmtree('dir')
    • 看上面的 os 思惟導圖,也有一個刪除目錄 API os.rmdir(dir) ,只能刪除空目錄
    • shutil.rmtree 功能則更高級,不管是空仍是非空目錄均可以刪除,確實是 High-level 啊 ^_^

對我來講,這三種經常使用的操做就能夠了。固然 shutil 的功能遠比這些要豐富的多,有興趣的同窗,能夠到 官方文檔 去深刻了解下。

小結

本篇主要介紹了 python 中文件經常使用的操做,內容包括打開文件,讀文件,寫文件,使用 osshutil 模塊來操做文件和目錄。下篇會介紹 jsonxml 處理,敬請期待。

相關文章列表

相關文章
相關標籤/搜索