Python 讀寫檔案

凌晨四點的藍發表於2019-02-24

1檔案與檔案路徑

1.1給出規格化得地址字串,這些字串是經過轉義的能直接在程式碼裡使用的字串

  需要匯入os模組 import os 

 

>>>os.path.join(`user`,`bin`,`spam`)  #可以看做為連線,值得注意的是,不要認為只能這樣來連線單個
`user\bin\spam`  #執行結果

>>>for fileName in os.listdir(path):
      totalSize=os.path.getsize(os.path.join(path,fileName))+totalSize
#使用os.path.join()來連線

 

1.2當前工作目錄 os.getcwd() 與 os.chdir(parameter) 

   

1 >>>import os
2 >>>os.getcwd()    #取得當前工作路徑的字串
3 `C:\Python3`
4 >>>os.chdir(`C:\Windows\System32`)    #改變工作路徑為傳入的字元#串
5 #若傳入路徑不存在,顯示FileNotFoundError錯誤
6 >>>os.getcwd()
7 `C:\Windows\System32`

 

1.3絕對路徑與相對路徑

  這個沒什麼好說的,就是需要注意下邏輯層次是從當前目錄出發的

1.4建立新資料夾 os.makedirs(parameter) 

  方法執行成功後,會建立所有必要的中間資料夾

1.5處理絕對路徑與相對路徑、尋找從A到B的 os.path.relpath(path,start) 、地址字串裁切:  os.path.basename(path)  os.path.dirname(path)   os.path.split(path) 

 1 >>>os.path.abspath(`.`)    #將返回引數的絕對路徑字串
 2 ‘C:\python3’
 3 >>>os.path.isabs(`.`)    #引數是絕對路徑是返回True,否則False
 4 False
 5 
 6 >>>os.path.relpath(`C:\Windows`,`C:\`)  #從後者到前者的路徑。若是沒有提供Start,就把當前目錄作為Start
 7 ‘Windows’
 8 
 9 >>>path=`C:\Windows\System32\calc.exe`
10 >>>os.path.dirname(path)  #返回一個包含最後一個斜槓之前內容的字串
11 ‘C:\Windows\System32’
12 >>>os.path.basename(path)  #返回一個包含最後一個斜槓之後內容的字串
13 ‘calc.exe’

 

  而當同時需要一個路徑的目錄名稱和基本名稱,就可以呼叫 os.path.split(path)來獲得這兩個字串的元組

1 >>>path=`C:\Windows\System32\calc.exe`
2 >>>os.path.split(path)
3 (`C:\Windows\System32`,`calc.exe`)

 

  此功能也可通過呼叫 os.path.dirname(path)   os.path.basename(path) 來實現,不過你也看出來了,顯然上者更應該得到我們青睞

1 >>>(os.path.dirname(path),os.path.basename(path))
2 (`C:\Windows\System32`,`calc.exe`)

 

  此外, os.path.split(path) 並不能接受一個檔案路徑並返回每個資料夾的字串的列表。假如你想要實現這樣的功能,可以使用 split() 字串方法,並根據 os.path.sep 中的字串進行分割,即將變數: os.path.sep 設定為適配與平臺的正確的資料夾分割斜槓

1 >>>path=`C:\Windows\System32\calc.exe`
2 path.split(os.path.sep)    #spilt()方法將返回一個列表,包含該路徑的所有部分,如果向他傳遞os.path.sep,就能在所有操作平臺上工作
3 [`C:`,`Windows`,`System32`,`calc.exe`]

 

1.7檢視檔案大小和資料夾內容

1 >>>os.path.getsize(`C:\Windows\System32\calc.exe`)
2 776192
3 >>>os.listdir(`C:\Windows\System32`)    #返回的是所提供的資料夾裡所有檔名的字串   ********注意這個在os裡,不是os.path裡
4 [`1232049.cpx`,
5 --snip---            
6 `2398r09w.dll`]

 

  示例:

1 >>>totalSize=0
2 >>>path=os.getcwd()
3 >>>for fileName in os.listdir(path):
4       totalSize=os.path.getsize(os.path.join(path,fileName))+totalSize
5 #使用os.path.join()來連線
6 `24324234`

 

1.8 檢查路徑有效性

1 >>>os.path.exists(`C:\Windows`)    #若指定資料夾存在
2 True
3 >>>os.path.isdir(`C:\Windows\System32`)    #若指定的引數存在,且是一個檔案
4 True
5 >>>os.path.isfile(`C:\Windows\System32`)    #若指定的引數存在並且是一個資料夾
6 False

 2檔案讀寫過程

  適用於純文字檔案(即只包含基本文字字元,不包含字型、大小和顏色資訊),關於二進位制檔案的先不做討論,只需要知道,python中有很多模組,這些模組,使得對二進位制檔案的處理變得更加容易。這裡我們以shelve模組為例

  1.1讀寫檔案

  python中,讀寫檔案有3個步驟:

    1.呼叫open(parameter)函式,返回一個File物件。

    2.呼叫File物件的read()、readlines()或write()方法。

    3.呼叫File物件的close()方法,關閉該檔案

1 >>>path=`C:\Windows\System32`
2 >>>helloFile=open(path)
3 >>>helloContent=helloFile.read()  #read()方法返回一個大字串
4 >>>helloContent
5 `Hello World
Hello World`
6 >>>helloContent=helloFile.readlines()  #readlines()方法返回一個字串的列表,每個字串值都已一個換行字元` ’結束
7 >>>helloContent
8 [`Hello Content `,
`Hello Content `]

  讀模式、寫模式、新增模式

    是以傳給open(parameter1,parameter2)的parameter2引數來區分的 

>>>baconFile=open(`bacon.txt`,`w`)    #w代表寫模式,會將原有的全部清除
>>>baconFile.write(`Hello world!
`)    #返回寫入字元的個數
13
>>>baconFile.close()
>>>baconFile=open(`bacon.txt`,`a`)    #a代表新增模式
>>>baconFile.write(`Bacon is not a vegetable.`)    #返回寫入字元的個數
25

3用shelve模組儲存變數

  利用shelve模組,可以將python程式中的變數儲存到二進位制的shelf檔案中。

>>>import shelve
>>>shelfFile=shelve.open(`mydata`)    #open()方法傳入的是檔名,返回的值儲存在變數‘shelfFile’中    *********若mydata不存在,會建立一個
>>>cats=[`Zophie`,`Pooka`,`Simon`]
>>>shelfFile[`cats`]=cats    #這個變數的值是cats(後),鍵也是cats(前)。鍵和值相互關聯,就像是一個字典一樣。cats(後)又被稱為shelf值,這個值可以死列表(如上)
>>>shelfFile.close()

  稍後可以使用shelve模組,重新開啟這些檔案並取出資料。不比選擇讀模式或者寫模式,因為他們既能讀,又能寫

>>> shelfFile=shelve.open(`mydata`)
>>> type(shelveFile)
<class `shelve.DbfilenameShelf`>
>>> shelfFile[`cats`]
[`Zophie`, `Pooka`, `Simon`]
>>>shelfFile.close()

  shelve的keys()與values()方法   **********要記得是keys()不是key()

shelfFile=shelve.open(`mydata`)
>>> list(shelfFile.keys())  #這些方法返回類似列表的值,而不是真正列表,所以應該將他們傳遞給list()函式,取得列表的形式
[`cats`]
>>> list(shelfFile.values())
[[`Zophie`, `Pooka`, `Simon`]]
>>> shelfFile.close()

4用pprint.pformat()函式儲存變數

   pprint.pprint() 函式將列表或字典中的內容漂亮列印到螢幕,而 pprint.pformat() 函式將返回同樣的文字字串,利用他可以將要儲存的字串到一個.py檔案中

>>> import pprint
>>> cats=[{`doec`: `chubby`, `name`: `Zophie`}, {`dese`: `fluffy`, `name`: `pooka`}]
>>> pprint.pformat(cats)
"[{`doec`: `chubby`, `name`: `Zophie`}, {`dese`: `fluffy`, `name`: `pooka`}]"
>>> fileObj=open(`myCats.py`,`w`)
>>> fileObj.write(`cats=`+pprint.pformat(cats)+`
`)    #這樣儲存
81
>>> fileObj.close()

可以匯入自己建立的.py檔案

>>> import myCats
>>> myCats.cats
[{`doec`: `chubby`, `name`: `Zophie`}, {`dese`: `fluffy`, `name`: `pooka`}]
>>> myCats.cats[0]
{`doec`: `chubby`, `name`: `Zophie`}

雖然建立一個.py檔案能讓任何人都能用一個簡單的文字編輯器讀取和修改檔案的內容,但是用shelve模組來儲存資料,是將變數儲存到檔案的最佳方式。因為只有基本資料型別:整形、浮點型、字串、列表和字典,可以作為簡單文字寫入一個檔案。

相關文章