前言

路徑與路徑名稱

不同作業系統路徑的討論

絕對路徑與相對路徑

目前工作目錄

import os
os.getcwd()
## 'C:\\Users\\zheng\\Documents'
os.listdir(os.curdir)
## ['.Rhistory', '.tmp.driveupload', 'boost_1_82_0', 'C++在財務工程.docx', 'desktop.ini', 'E-book', 'HP Victus使用手冊.pdf', 'HP使用指南.pdf', 'mathproj', 'My Music', 'My Pictures', 'My Videos', 'NCCU111_2', 'OneNote Notebooks', 'Python Scripts', 'QuantLib-1.30', 'R 資料科學與統計(一).pptx', 'R 資料科學與統計(三).pptx', 'R 資料科學與統計(二).pptx', 'R 資料科學與統計(四).pptx', 'rsconnect', 'SI_Test', 'temp', 'using_filesystem.html', 'using_filesystem.Rmd', 'Visual Studio 2022', 'WindowsPowerShell', '~$+在財務工程.docx', '自訂 Office 範本']
os.listdir('.')  # '.' 代表目前工作目錄
## ['.Rhistory', '.tmp.driveupload', 'boost_1_82_0', 'C++在財務工程.docx', 'desktop.ini', 'E-book', 'HP Victus使用手冊.pdf', 'HP使用指南.pdf', 'mathproj', 'My Music', 'My Pictures', 'My Videos', 'NCCU111_2', 'OneNote Notebooks', 'Python Scripts', 'QuantLib-1.30', 'R 資料科學與統計(一).pptx', 'R 資料科學與統計(三).pptx', 'R 資料科學與統計(二).pptx', 'R 資料科學與統計(四).pptx', 'rsconnect', 'SI_Test', 'temp', 'using_filesystem.html', 'using_filesystem.Rmd', 'Visual Studio 2022', 'WindowsPowerShell', '~$+在財務工程.docx', '自訂 Office 範本']
os.chdir("C:\\")
os.getcwd()
## 'C:\\'
os.listdir(os.curdir)
## ['$Recycle.Bin', '$WinREAgent', 'AVScanner.ini', 'Config.Msi', 'dism.log', 'Documents and Settings', 'DumpStack.log', 'DumpStack.log.tmp', 'hiberfil.sys', 'hp', 'hpswsetup', 'Intel', 'Microsoft', 'office19rpt.pdf', 'OneDriveTemp', 'pagefile.sys', 'PerfLogs', 'Program Files', 'Program Files (x86)', 'ProgramData', 'Recovery', 'rtools43', 'swapfile.sys', 'swsetup', 'System Volume Information', 'System.sav', 'Users', 'Windows']

使用pathlib存取目錄

import pathlib
cur_path = pathlib.Path()  # 建立Path路徑物件
cur_path.cwd()             # 取得目前工作目錄
## WindowsPath('C:/Users/zheng/Documents')

處理路徑名稱

import os
os.path.join('bin', 'utils', 'disktools')                # Windows OS
## 'bin\\utils\\disktools'
# 不好的做法 
os.path.join('mydir\\bin', 'utils\\disktools\\chkdisk')
## 'mydir\\bin\\utils\\disktools\\chkdisk'
# 建議做法
path1 = os.path.join('mydir', 'bin') 
path2 = os.path.join('utils','disktools','chkdisk')      
os.path.join(path1, path2)
## 'mydir\\bin\\utils\\disktools\\chkdisk'

路徑的basename

import os
os.path.split(os.path.join('some', 'directory', 'path.jpg'))   
## ('some\\directory', 'path.jpg')
os.path.basename(os.path.join('some', 'directory', 'path.jpg'))   # 只回傳basename
## 'path.jpg'
os.path.dirname(os.path.join('some', 'directory', 'path.jpg'))    # 只回傳路徑中不包含basename的部分
## 'some\\directory'
os.path.splitext(os.path.join('some', 'directory', 'path.jpg'))
## ('some\\directory\\path', '.jpg')
import os
os.path.abspath("using_filesystem.html")
## 'C:\\Users\\zheng\\Documents\\using_filesystem.html'
from pathlib import Path
cur_path = Path()
cur_path
## WindowsPath('.')
print(cur_path.joinpath('bin', 'utils', 'disktools'))
## bin\utils\disktools
cur_path / 'bin' / 'utils' / 'disktools'
## WindowsPath('bin/utils/disktools')
a_path = Path('bin/utils/disktools')
a_path.parts
## ('bin', 'utils', 'disktools')
a_path = Path('.')  # 目前工作路徑
a_path.resolve()    # 取得絕對路徑
## WindowsPath('C:/Users/zheng/Documents')
a_path = Path('some', 'directory', 'path.jpg')
a_path.name
## 'path.jpg'
a_path.parent
## WindowsPath('some/directory')
a_path.suffix
## '.jpg'

其他有用的函數與常數

os.curdir
## '.'
os.pardir
## '..'
import os
path = os.path.join("C:\\Windows\\temp", os.pardir, os.curdir)
path  # 指向的目錄是:C:\Windows\
## 'C:\\Windows\\temp\\..\\.'
os.path.isdir(os.path.join("C:\\Windows\\temp", os.pardir, os.curdir))  
## True
import os

# 檢查目錄存在與否
# path = '/path/to/directory'
if os.path.isdir(path):
    print(f"{path} 是一個目錄")
else:
    print(f"{path} 不是一個目錄")
## C:\Windows\temp\..\. 是一個目錄
import os
os.name
## 'nt'
import sys
sys.platform   # 即使是64位元版本的Windowns
## 'win32'

取得檔案相關資訊

import os
os.path.exists('C:\\Users\\myuser\\My Documents')
## False
os.path.exists('C:\\Users\\myuser\\My Documents\\Letter.doc')
## False
os.path.exists('C:\\Users\\myuser\\\My Documents\\ljsljkflkjs')
## False
os.path.isdir('C:\\Users\\myuser\\My Documents')
## False
os.path.isfile('C:\\Users\\ myuser\\My Documents')
## False
os.path.isdir('C:\\Users\\ myuser\\My Documents\\Letter.doc')
## False
os.path.isfile('C:\\Users\\ myuser\\My Documents\\Letter.doc')
## False

使用os.walk()處裡所有子目錄的所有檔案

temp dir1 file3.txt
file4.txt
dir2 dir3 file6.txt
file7.txt
file5.txt
file1.txt
file2.txt
import os
os.getcwd()
## 'C:\\Users\\zheng\\Documents'
for entry in os.walk("temp"):
  print(entry)
## ('temp', ['dir1', 'dir2'], ['file1.txt', 'file2.txt'])
## ('temp\\dir1', [], ['file3.txt', 'file4.txt'])
## ('temp\\dir2', ['dir3'], ['file5.txt'])
## ('temp\\dir2\\dir3', [], ['file6.txt', 'file7.txt'])
ls = os.walk("temp")
next(ls)
## ('temp', ['dir1', 'dir2'], ['file1.txt', 'file2.txt'])
next(ls)
## ('temp\\dir1', [], ['file3.txt', 'file4.txt'])
for entry in os.walk("temp", topdown = False):
  print(entry)
## ('temp\\dir1', [], ['file3.txt', 'file4.txt'])
## ('temp\\dir2\\dir3', [], ['file6.txt', 'file7.txt'])
## ('temp\\dir2', ['dir3'], ['file5.txt'])
## ('temp', ['dir1', 'dir2'], ['file1.txt', 'file2.txt'])
## Example:
# import os
# for root, dir, files in os.walk(os.curdir):
#   print("{0} has {1} files".format(root, len(files)))
#   if ".git" in dirs:                      # 檢查子目錄list是否包含.git的名稱
#     dir.remove(".git")                    # 從子目錄list中移除名為.git的目錄