为何glob启用recursive=True时重复10次匹配同一文件?
为什么多
**加recursive=True会重复匹配同一文件 当你使用glob.glob("/home/result/test/**/**/**/*.xml", recursive=True)时,同一文件被匹配10次的核心原因是多个**在递归模式下的匹配逻辑叠加:
递归模式下的
**规则
在recursive=True时,**代表匹配任意层级的目录(包括0层空路径)。也就是说每个**既可以匹配空,也可以匹配1级、2级甚至更多级目录。组合匹配的次数计算
目标文件的路径是/home/result/test/foo/bar/test_results/testsystems.xml,从test/到testsystems.xml之间有3级子目录(foo/、bar/、test_results/)。
你写的三个**需要共同“分配”这3级目录的匹配任务,允许某个**匹配0层。这本质是数学里的可重复组合问题,计算公式为C(n+k-1, k-1):- n是需要匹配的目录层级数(3)
- k是
**的数量(3)
代入得C(3+3-1, 3-1) = C(5,2) = 10,刚好对应你看到的10次重复。
直观的匹配组合示例
三个**的匹配方式包括但不限于:- 第一个
**匹配foo/bar/test_results/,后两个**匹配空路径 - 第一个
**匹配foo/,第二个匹配bar/test_results/,第三个匹配空 - 第一个
**匹配foo/,第二个匹配bar/,第三个匹配test_results/
所有10种组合最终都会指向同一个文件路径,所以glob会返回10次相同结果。
- 第一个
正确写法的逻辑
- 递归模式下,单个
**就足够匹配任意层级的子目录,所以glob.glob("/home/result/test/**/*.xml", recursive=True)只会匹配每个文件一次。 - 如果不设置
recursive=True,**会被当作普通的单级目录匹配符(等价于*),此时/home/result/test/**/**/**/*.xml只会匹配test下第4级目录中的xml文件,不会出现重复匹配。
内容的提问来源于stack exchange,提问作者Sir l33tname
相关产品推荐
相关产品推荐

