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檔案中。