[問題] 排除os.walk中的「路徑」

看板Python作者 (佑)時間6年前 (2019/08/06 02:23), 6年前編輯推噓3(3024)
留言27則, 6人參與, 5年前最新討論串1/1
簡單來說 在使用os.walk的時候 有些子目錄是不想讀取要排除的 目前有找到兩個方法 第一種 import os for root, dirs, files in os.walk(a): if '目錄名稱' in dirs: dirs.remove('目錄名稱') 第二種 import os exclude = set([目錄名稱]) for root, dirs, files in os.walk(top, topdown=True): dirs[:] = [d for d in dirs if d not in exclude] 第二種最後一行不懂那個dirs[:]和d為什麼在for前面 雖然沒有就無法執行... 這兩種原理都相同都是對dirs進行修改 藉此讓os.walk不找排除的目錄 但我發現一個問題 假設目錄列表是這樣 root-- | ---1 | ---2 | ---3--- | ---1 | ---2 我想要排除root---3---2所以輸入2的時候 他會連同root---2一起排除 所以我想要排除的是路徑 不是名稱 有什麼函數嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.224.166.100 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1565029395.A.7C3.html

08/06 07:06, 6年前 , 1F
搞懂os.walk傳回你就會寫了。
08/06 07:06, 1F

08/06 07:06, 6年前 , 2F
你可以用root和dirs的組合去篩選。
08/06 07:06, 2F

08/06 07:06, 6年前 , 3F
然後第二種那個叫list comprehension,在python會是很常見
08/06 07:06, 3F

08/06 07:06, 6年前 , 4F
的寫法。
08/06 07:06, 4F

08/06 10:08, 6年前 , 5F
是指os.path.join?好像沒用 至少沒辦法用上面這兩種方
08/06 10:08, 5F

08/06 10:08, 6年前 , 6F
法改
08/06 10:08, 6F

08/06 11:33, 6年前 , 7F
資料結構 演算法沒學好 這種問題問不完的
08/06 11:33, 7F

08/06 12:00, 6年前 , 8F
root是根目錄dirs是子目錄的名稱 用上面的方法只能修改d
08/06 12:00, 8F

08/06 12:00, 6年前 , 9F
irs
08/06 12:00, 9F

08/06 12:01, 6年前 , 10F
join會跑出list不是str
08/06 12:01, 10F

08/06 13:20, 6年前 , 11F
root和files組起來就是完整路徑了吧。
08/06 13:20, 11F

08/06 13:32, 6年前 , 12F
你的問題更簡單,直接比root就好了
08/06 13:32, 12F

08/06 13:33, 6年前 , 13F
你先把root, dirs, files印出來看看os.walk的回傳值
08/06 13:33, 13F

08/06 13:33, 6年前 , 14F
是什麼東西吧。
08/06 13:33, 14F

08/06 20:15, 6年前 , 15F
成功了...但是放不進要用的代碼...
08/06 20:15, 15F
import fnmatch import os import re excludes = [''] excludes = r'|'.join([fnmatch.translate(x) for x in excludes]) or r'$.' for root, dirs, files in os.walk('D:\long\Desktop\image'): dirs[:] = [os.path.join(root, d) for d in dirs] dirs[:] = [d for d in dirs if not re.match(excludes, d)] print(dirs) 成功運轉 接下來是想搞懂代碼是什麼意思 感謝froce告知那條奇特的函數是 list comprehension 想問一下 r'|' r'$.' 這兩個是出自哪個函數 搜尋不了 r印象中是讀取檔案 但是讀取這兩個是什麼意思? ※ 編輯: s4028600 (125.224.166.100 臺灣), 08/06/2019 21:20:08

08/06 22:34, 6年前 , 16F
那個 r 是 raw 的意思,意思是原始字串,可以避免需要逸出
08/06 22:34, 16F

08/06 22:34, 6年前 , 17F
的情況
08/06 22:34, 17F

08/07 00:26, 6年前 , 18F
了解 感謝
08/07 00:26, 18F

08/07 09:39, 6年前 , 19F
這樣只會複製貼上的學法問題問不完
08/07 09:39, 19F

08/07 09:39, 6年前 , 20F
連 for 迴圈都不會自己寫
08/07 09:39, 20F

08/07 09:48, 6年前 , 21F
你的需求用 os.path 下面的function 就能達成
08/07 09:48, 21F

08/09 00:02, 5年前 , 22F
呃...找不到你說的東西 話說我也只會修改和模仿而已 所
08/09 00:02, 22F

08/09 00:02, 5年前 , 23F
以只要有範例拿來用就行了 如果沒有或實在太難懂就只能
08/09 00:02, 23F

08/09 00:02, 5年前 , 24F
乾脆的放棄 只是還是會學一點 不然連改都沒辦法...
08/09 00:02, 24F

08/09 00:12, 5年前 , 25F
不過有個失敗的代碼用的函數很有用 要是當初知道 就不會
08/09 00:12, 25F

08/09 00:12, 5年前 , 26F
找程式找到爆掉了 結果居然在放棄找之後 偶然發現我平常
08/09 00:12, 26F

08/09 00:12, 5年前 , 27F
用的程式有這功能 讓我吐血啊...
08/09 00:12, 27F
文章代碼(AID): #1TI7GJV3 (Python)
文章代碼(AID): #1TI7GJV3 (Python)