[英]Improve efficiency of python os.walk + regular expression algorithm
我正在使用os.walk從特定文件夾中選擇與正則表達式匹配的文件。
for dirpath, dirs, files in os.walk(str(basedir)):
files[:] = [f for f in files if re.match(regex, os.path.join(dirpath, f))]
print dirpath, dirs, files
但這必須處理basedir下的所有文件和文件夾,這非常耗時。 我正在尋找一種方法來使用與文件相同的正則表達式來過濾掉每個步驟中不需要的目錄。 或者只匹配部分正則表達式的方法......
例如,在像這樣的結構中
/data/2013/07/19/file.dat
使用例如以下正則表達式
/data/(?P<year>2013)/(?P<month>07)/(?P<day>19)/(?P<filename>.*\.dat)
查找所有.dat文件,無需查看eg / data / 2012
例如,如果您只想處理/data/2013/07/19
os.walk()
,只需從目錄top /data/2013/07/19
os.walk()
啟動os.walk()
。 這類似於Tommi Komulainen的建議,但您無需修改循環代碼。
我偶然發現了這個問題(很明顯問題是什么,即使沒有實際問題),所以沒有人回答我猜它可能會有用,即使很晚。
您需要將原始RE拆分為多個段,以便可以過濾循環內的中間目錄。 過濾, 然后匹配文件。
regex_parts = regex.split("/")
del regex_parts[0] # Because [0] = "" it's not needed
for base, dirs, files in os.walk(root):
if len(regex_parts) > 1:
dirs[:] = [dir for dir in dirs if re.match(regex_parts[0], dir)]
regex_parts[:] = regex_parts[1:]
continue
files[:] = [f for f in files if re.match(regex, os.path.join(dirpath, f))]
由於您匹配文件(路徑的最后一部分),因此在您盡可能過濾掉之前沒有理由進行實際匹配。 len檢查在那里,所以可能匹配最后一部分的目錄不會被破壞。 這可能會更有效率,但它對我有用(我今天也有類似的問題)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.