提高python os.walk +正则表达式算法的效率

时间:2013-07-19 13:13:21

标签: python regex os.walk

我正在使用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文件,无需查看例如/数据/ 2012

2 个答案:

答案 0 :(得分:1)

例如,如果您只想处理/data/2013/07/19中的文件,只需从目录 top os.walk()启动/data/2013/07/19即可。这类似于Tommi Komulainen的建议,但您无需修改​​循环代码。

答案 1 :(得分:0)

我偶然发现了这个问题(很清楚问题是什么,即使没有实际问题),所以没有人回答我猜它可能会有用,即使很晚。

您需要将原始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检查在那里,所以可能匹配最后一部分的目录不会被破坏。这可能会更有效率,但它对我有用(我今天也有类似的问题)。