1. 程式人生 > >python檔案讀寫和整理

python檔案讀寫和整理

**在windows上面,路徑的書寫使用反斜槓作為資料夾之間的分隔符;在OS X或者Linux上則是是用正斜槓。


python上對檔案進行操作要使用到os這個模組。

1.os模組和os.path模組的相關方法。

使用os.path.join()函式,通過給它傳遞各資料夾的名字,會返回一個檔案路徑的字串,並根據使用的不同平臺包含正確的路徑分隔符。

<span style="font-size:18px;">import os 
os.path.join('c:','hello','123')</span>

利用os.getcwd()函式可以得到當前路徑。並可以利用os.chdir()來改變它
<span style="font-size:18px;">os.getcwd()
os.chdir('e:\\hello')</span>

利用可以建立新的資料夾。
<span style="font-size:18px;">os.makedirs('hi')</span>

os.path和os常用函式:

os.path.abspath(path)將返回引數的絕對路徑的字串,這是將相對路徑轉化為絕對路徑的最佳方法。

os.path.isabs(path)用於判斷是否絕對路徑,是就返回True

os.path.relpath(path,start)將返回從start到path的相對路徑的字串。如果沒有提供start則以當前目錄作為start

os.path.dirname(path)將返回一個字串包含path引數中最後一個斜槓之前的所有內容。

os.path.basename(path)將返回一個字串包含path引數中最後一個斜槓之後的內容。

os.path.split(path)將返回一個路徑的目錄名稱和基本名稱。若需得到路徑中每個資料夾的字串列表,則要使用split方法(不是os.path中的split),並將os.path.sep作為引數

os.path.getsize(path)將返回path引數中檔案的位元組數。

os.listdir(path)將返回檔名字串的列表,包含path引數中的每個檔案。

os.path.exists(path)若path所指的檔案或資料夾存在,則返回True

os.path.isfile(path)若path所指的是一個檔案且存在,則返回True。

os.path.isdir(path)若path所指的是一個資料夾且存在,則返回True。

2.檔案讀寫過程。

3個步驟:

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

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

(3)呼叫File物件的close()方法。

檔案讀取:

如果希望將整個檔案的內容讀取為一個字串值,就使用File物件的read()方法。或者使用readlines()方法,從該檔案獲得一個字串的列表,每個字串就是文字中的每一行。

檔案寫入:

寫入檔案時,需要用'w'(寫入模式)或者'a'(新增模式)開啟檔案,獲得一個File物件。

3.用shelve模組儲存變數。

利用shelve模組,可以將python程式中的變數儲存到二進位制的shelf檔案中。這樣程式就可以從硬碟恢復變數的資料。

eg.

<span style="font-size:18px;">import shelve
shelfFile = shelve.open('mydata')
team=['Arsenal','Liverpool','Bacelona']
shelfFile['team']=team
shelfFile.close()</span>

執行程式之後,會出現三個新檔案:mydata.bak,mydata.dir,mydata.dat

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

eg.

<span style="font-size:18px;">import shelve
shelfFile=shelve.open('mydata')
shelfFile['team']                             --->['Arsenal','Liverpool','Bacelona']
shelfFile.close()</span>
如同字典一樣,shelf值也有keys()和values()方法,返回shelf中鍵和值的類似列表的值。因為這些方法返回類似列表的值,而不是真正的列表,所以應該將他們傳遞給list()函式,去的列表的形式。

4.幾個常用的其他函式:

random.shuffle():該函式會重新隨機排列傳遞給他的列表中的值。

random.sample():該函式可以從一個列表中隨機選出若干個你所需要的值。第一個引數是你希望選擇的列表,第二個引數是你希望選擇的值的個數。

5.檔案整理:使用shutil模組

shutil模組中包含一些可以幫助複製,移動,改名和刪除檔案的函式。

  (1)複製檔案和資料夾:

     呼叫shutil.copy(source,destination),將source處的檔案複製到路徑destination處的資料夾。如果destination是一個檔名,它將作為被複制檔案的新名字。該函式返回一個字串表示被複制檔案的路徑。


  shutil.copytree()將複製整個資料夾,以及它包含的資料夾和檔案。


 (2)檔案和資料夾的移動和改名:

    呼叫shutil.move(source,destination),將路徑source處的資料夾移動到路徑destination,並返回新位置的絕對路徑的字串。


destination也可以指定一個檔名,此時檔案移動時被改名。

 (3)檔案和資料夾的刪除。

  用os.unlink(path)可以刪除path處的檔案。


  用os.rmdir(path)將刪除path處的資料夾。該資料夾必須為空,其中沒有任何檔案或資料夾。

  用shutil.retree(path)將刪除path處的資料夾,它包含的所有檔案和資料夾都會被刪除。


 (4)使用send2trash模組安全刪除:

  使用第三方的send2trash模組會將資料夾和檔案傳送到回收站,而不是永久刪除它們。這樣如果不小心誤操作,也可以從回收站中恢復。

 (5)使用os.walk()遍歷目錄:

當需要遍歷目錄樹時候,可以使用os模組的walk()函式。該函式被傳入一個資料夾路徑在迴圈的每次迭代中,返回三個值:

*當前資料夾名稱的字串。

*當前資料夾中子資料夾的字串列表。

*當前資料夾中檔案的字串列表。

當資料夾中還存在有子目錄,就會一直迭代下去。當然,工作目錄並不會隨著walk函式的迭代而改變。


6.ZIP檔案處理:

(1)讀取zip檔案

要讀取Zip檔案的內容,首先要建立一個類似於File物件的ZipFile物件。ZipFile物件有一個namelist()方法,會返回ZIP檔案中包含的所有檔案和資料夾的字串列表。這些字串可以傳遞給ZipFile物件的getinfo()方法,返回一個關於特定檔案的ZipInfo物件。裡面有很多屬性。例如演示的file_size和compress_size屬性

(2)解壓縮:

使用ZipFile物件的extractall()方法解壓所有檔案和資料夾,放在當前目錄。也可以給該方法傳遞一個資料夾名稱,將檔案和資料夾解壓縮到該資料夾內。

ZipFile物件的extract()方法可以解壓單個檔案。傳遞給該方法的檔案必須匹配namelist()返回的字串列表中的一個,也可以向extract()傳遞第二個引數,作為destination。


(3)新增壓縮檔案和建立Zip檔案:

要建立Zip檔案,要以'w'模式開啟ZipFile物件。向write()方法傳入一個路徑,程式就會壓縮該路徑所指的檔案,新增到新的Zip中。

write()方法的第一個引數是一個字串,代表要新增的檔名。第二個引數是“壓縮型別”,告訴計算機是用什麼演算法壓縮檔案。

若以'a'模式開啟ZipFile物件,則可以將檔案新增到原有的Zip檔案中。