python 文件路徑問題


需要用到 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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM