7.1. 操作目錄
若需要保留程式所輸出的結果時,則會將其結果存入檔案(File)。在需要存取檔案時會包含兩個步驟:確定檔案的存放路徑(Path)及檔案名稱(File name)。首先,在確定檔案的存取路徑,存取路徑表示檔案在電腦中的存放位置,需要注意本機系統是使用什麼樣的作業系統來使用相對應的路徑表示方式,例如:在Windows系統中使用反斜線「\」作為目錄(或資料夾)之間的分隔符號,在Linux系統中使用斜線「/」作為目錄之間的分隔符號。檔案名稱是使用者給予的一個名稱再加上副檔案,副檔案則是檔案類型,例如:report.docx,report為檔案的名稱,.docx為副檔名,所以可以得知 report.docx 檔是某個報告的Word檔。
使用 os 模組
在Python中提供 os 模組,讓使用者可以透過此模組進行目錄及檔案的相關操作,使用 import 關鍵字將此模組匯入程式中。
import os
使用 getcwd() 得到目前的工作目錄
使用 getcwd() 可以得到Python目前的工作目錄。
>>> import os
>>> os.getcwd()
'C:\\Users\\xxxxx\\AppData\\Local\\Programs\\Python\\Python36'
使用 chdir() 切換工作目錄
想要切換到別的目錄時,可以使用 chdir() 來達成。若目標目錄不存在時,則會產生錯誤訊息。
>>> target_directory = 'C:\\Users\\xxxxx\\Desktop\\File_read_write' # 這兩種方式都可以表示
>>> target_directory = r'C:\Users\xxxxx\Desktop\File_read_write' # Windows系統中的路徑
>>> os.chdir(target_directory)
>>> os.getcwd()
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> target_directory += r'\new_directory'
>>> target_directory
'C:\\Users\\xxxxx\\Desktop\\File_read_write\\new_directory'
>>> os.chdir(target_directory)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 2] 系統找不到指定的檔案。: 'C:\\Users\\xxxxx\\Desktop\\File_read_write\\new_directory'
使用 listdir() 列出所有子目錄及檔案
使用 listdir() 可以得到目前工作錄中所有的子目錄及檔案,如果使用的對象不是目錄時會產生錯誤訊息。
>>> target_directory = os.getcwd()
>>> target_directory
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.listdir()
['sub_directory', 'The_Zen_of_Python.txt']
>>> os.listdir('sub_directory')
['file_in_sub_directory.txt'])
>>> os.listdir('The_Zen_of_Python.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NotADirectoryError: [WinError 267] 目錄名稱無效。: 'The_Zen_of_Python.txt'
使用 mkdir() 建立目錄
使用 mkdir() 可以在目錄的工作目錄中建立一個新的目錄。
>>> os.mkdir('sub_directory2')
>>> os.listdir()
['sub_directory', 'sub_directory2', 'The_Zen_of_Python.txt']
使用 rmdir() 移除目錄
使用 rmdir() 來移除目前工作目錄中的一個目錄。
>>> os.rmdir('sub_directory')
>>> os.listdir()
['sub_directory', 'The_Zen_of_Python.txt']
使用 rename() 更改目錄名稱
使用 rename() 可以更改目前工作目錄中的子目錄名稱。
>>> os.rename('sub_directory', 'sub_directory2')
>>> os.listdir()
['sub_directory2', 'The_Zen_of_Python.txt']
使用 os.path 模組
在 os.path 模組中有一些與路徑相關的函數,這些函數可以用來處理兩種指定路徑(目錄或檔案路徑)的問題。
os.path.函數名稱()
上述提到的兩種指定路徑分別為:
- 絕對路徑:從「根目錄」到目前工作目錄的路徑,例如:'C:\Users\xxxxx\Desktop\File_read_write'。
- 相對路徑:相對於目前工作目錄的路徑,例如:'.\File_read_write'。
使用 abspath() 取得絕對路徑
使用 abspath() 來取得目錄或檔案的絕對路徑,其中一個點「.」表示目前的這個目錄,及兩個點「..」表示上一層的目錄(或父目錄)。
>>> os.getcwd()
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.listdir()
['File_read_write', 'Sub_directory', 'The_Zen_of_Python.txt']
>>> os.path.abspath('.') # 取得目前工作目錄的路徑
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.abspath('..') # 取得目前工作目錄之父目錄的路徑
'C:\\Users\\xxxxx\\Desktop'
使用 isabs() 確認是否為絕對路徑
若需要檢查某一路徑是否為絕對路徑時,可以使用 isbabs() 來確認。
>>> os.path.isabs('.') # 判斷目前工作目錄的相對路徑
False
>>> os.path.isabs(os.path.abspath('.')) # 判斷目前工作目錄的絕對路徑
True
使用 relpath() 取得相對路徑
使用 relpath() 來取得從某一個目錄位置到另一個目錄位置的相對路徑
>>> os.getcwd()
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.relpath(os.getcwd(), 'C:\\')
'Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.relpath(os.getcwd(), 'C:\\Windows
'..\\Users\\xxxxx\\Desktop\\File_read_write'
使用 dirname() 取得路徑的目錄名稱
使用 dirname() 取得路徑中有關於目錄名稱的部份。
>>> os.getcwd()
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.dirname(os.getcwd())
'C:\\Users\\xxxxx\\Desktop'
>>> os.path.abspath('Zen_of_Python.txt')
'C:\\Users\\xxxxx\\Desktop\\File_read_write\\Zen_of_Python.txt'
>>> os.path.dirname(os.path.abspath('Zen_of_Python.txt'))
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
使用 basename() 取得路徑的基本名稱
使用 basename() 取得路徑中有關於基本名稱(目前工作目錄或檔案名稱)的部份。
>>> os.getcwd()
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.basename(os.getcwd())
'File_read_write'
>>> os.path.abspath('Zen_of_Python.txt')
'C:\\Users\\xxxxx\\Desktop\\File_read_write\\Zen_of_Python.txt'
>>> os.path.basename(os.path.abspath('Zen_of_Python.txt'))
'Zen_of_Python.txt'
使用 split() 切割路徑
由於使用 os 或 os.path 模組所取得的路徑都是字串,所以使用字串的 split() 及 os.path.sep 路徑的分割符號來切割一個路徑,隨後回傳一個字串串列。
>>> os.getcwd()
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.getcwd().split(os.path.sep)
['C:', 'Users', 'xxxxx', 'Desktop', 'File_read_write']
使用 join() 合併路徑
使用 join() 來合併某一個目錄及檔案串列來得到完整的路徑。
>>> os.path.join(*['C:', 'Users', 'xxxxx', 'Desktop', 'File_read_write'])
'C:Users\\xxxxx\\Desktop\\File_read_write' # 'C:'需要處理
>>> os.path.join(*['C:', 'Users', 'xxxxx', 'Desktop', 'File_read_write']).replace(':', ':\\')
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.join(*['C:', 'Users', 'xxxxx', 'Desktop', 'File_read_write', 'Zen_of_Python.txt']).replace(':', ':\\')
'C:\\Users\\xxxxx\\Desktop\\File_read_write\\Zen_of_Python.txt'
使用 exists() 檢查路徑是否存在
使用 exits() 檢查某一個路徑(目錄或檔案)是否存在。
>>> p = os.getcwd()
>>> p
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.exists(p)
True
>>> p += r'\new_directory'
>>> p
'C:\\Users\\xxxxx\\Desktop\\File_read_write\\new_directory'
>>> os.path.exists(p)
False
使用 isdir() 檢查路徑是否為目錄
使用 isdir() 檢查某一個路徑是否為目錄路徑。
>>> p = os.getcwd()
>>> p
'C:\\Users\\xxxxx\\Desktop\\File_read_write'
>>> os.path.isdir(p)
True
>>> p += r'\Zen_of_Python.txt'
>>> p
'C:\\Users\\xxxxx\\Desktop\\File_read_write\\Zen_of_Python.txt'
>>> os.path.isdir(p)
False
參考資料
- os 模組
- os.path 模組
- Zen of Pyton
- Python自動化的樂趣, 第九章, Al Sweigart 著、H&C 譯, 碁峰
- Python編程入門第3版(簡), 第八章, Toby Donaldson著, 人民郵電出版社
- 精通Python, 第十章, Bill Lubanovic著, 賴屹民譯, 歐萊禮