需要用到 os 模塊和 sys 模塊
import os print(__file__)# 輸出相對路徑 print(os.path.abspath(__file__)) #輸出絕對路徑 # D:\Project\180410gentic\Rahul_Genetic_Program\analysis\test.py print os.path.dirname(os.path.abspath(__file__)) #返回目錄名不要文件名 # D:\Project\180410gentic\Rahul_Genetic_Program\analysis import sys BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 設為基本路徑 sys.path.append(BASE_DIR) #將路徑添加環境變量
os.walk目錄遍歷
os.walk(top, topdown=True, onerror=None, followlinks=False)
- top是要遍歷的目錄。
- topdown是代表要從上而下遍歷還是從下往上遍歷。
- onerror可以用來設置當遍歷出現錯誤的處理函數(該函數接受一個OSError的實例作為參數),設置為空則不作處理。
- followlinks表示是否要跟隨目錄下的鏈接去繼續遍歷,要注意的是,os.walk不會記錄已經遍歷的目錄,所以跟隨鏈接遍歷的話有可能一直循環調用下去。
os.walk返回的是一個3個元素的元組 (root, dirs, files)
,分別表示遍歷的路徑名,該路徑下的目錄列表和該路徑下文件列表。注意目錄列表和文件列表不是具體路徑,需要具體路徑(從root開始的路徑)的話可以用 os.path.join(root,dir)
和 os.path.join(root,dir)
。
├── a.py ├── b.py ├── c.py ├── dir1 │ ├── dir4 │ │ ├── g.py │ │ └── h.py │ ├── dirx │ │ ├── diry │ │ │ └── k.py │ │ └── z.py │ ├── e.py │ ├── f.py │ └── g.py ├── dir2 │ ├── dira │ │ └── dirb │ │ └── dirc │ │ └── aha.py │ ├── k.py │ ├── l.py │ └── m.py └── dir3 ├── dir5 │ └── z.py ├── x.py └── y.py 10 directories, 17 files
測試topdown
當我用 os.walk
遍歷這個目錄時,程序和輸出如下:
import os path = '/Users/nisen/Projects/python_advanced_class/test/test_os_walk' for root, dirs, files in os.walk(path, True): print('root: %s' % root) print('dirs: %s' % dirs) print('files: %s' % files) print (' ')
結果如下,從root的路徑可以看出遍歷是自上而下的:
root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk dirs: ['dir1', 'dir2', 'dir3'] files: ['a.py', 'b.py', 'c.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1 dirs: ['dir4', 'dirx'] files: ['e.py', 'f.py', 'g.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dir4 dirs: [] files: ['g.py', 'h.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx dirs: ['diry'] files: ['z.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx/diry dirs: [] files: ['k.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2 dirs: ['dira'] files: ['k.py', 'l.py', 'm.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira dirs: ['dirb'] files: [] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb dirs: ['dirc'] files: [] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb/dirc dirs: [] files: ['aha.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3 dirs: ['dir5'] files: ['x.py', 'y.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3/dir5 dirs: [] files: ['z.py']
而當設置os.walk的topdown為False時,結果如下, 可以看出他是自上而下遍歷的:
root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dir4 dirs: [] files: ['g.py', 'h.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx/diry dirs: [] files: ['k.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx dirs: ['diry'] files: ['z.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1 dirs: ['dir4', 'dirx'] files: ['e.py', 'f.py', 'g.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb/dirc dirs: [] files: ['aha.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb dirs: ['dirc'] files: [] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira dirs: ['dirb'] files: [] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2 dirs: ['dira'] files: ['k.py', 'l.py', 'm.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3/dir5 dirs: [] files: ['z.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3 dirs: ['dir5'] files: ['x.py', 'y.py'] root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk dirs: ['dir1', 'dir2', 'dir3'] files: ['a.py', 'b.py', 'c.py']
os.path.join()函數用於路徑拼接文件路徑
-
會從第一個以”/”開頭的參數開始拼接,之前的參數全部丟棄。
-
以上一種情況為先。在上一種情況確保情況下,若出現”./”開頭的參數,會從”./”開頭的參數的上一個參數開始拼接
import os print("1:",os.path.join('aaaa','/bbbb','ccccc.txt')) print("2:",os.path.join('/aaaa','/bbbb','/ccccc.txt')) print("3:",os.path.join('aaaa','./bbb','ccccc.txt')) # 1: /bbbb\ccccc.txt # 2: /ccccc.txt # 3: aaaa\./bbb\ccccc.txt