递归为假时,为什么Glob模块搜索立即子目录?

时间:2019-02-25 19:56:30

标签: python python-3.x

我具有使用glob识别要删除的文件的功能。在第一个函数中,递归切换按预期工作。在第二个函数中,递归切换有些用...这是我下面的代码示例。

for item in glob.glob(myfile_path + '/**', recursive=self.recrsv.get()):
    if item.endswith(".mesg"):
        os.remove(os.path.join(myfile_path, item))

此功能按预期工作。

for junk in glob.glob(myfile_path + '/**' + "/*.*[0-9][0-9][0-9][0-9]", recursive=self.recrsv.get()):
    os.remove(os.path.join(myfile_path, junk))

此功能有些起作用。无论recursive设置为True还是False,它仍然进入第一级子目录并删除文件*.*[0-9][0-9][0-9][0-9]。除非将recursive设置为True,否则它不会进入第二级子目录。

注意:在tkinter小部件的“检查”按钮中,将递归设置为名为tk.BooleanVar()的{​​{1}}。

谢谢。

3 个答案:

答案 0 :(得分:1)

使用recursive=False

myfile_path + '/**' + "/*.*[0-9][0-9][0-9][0-9]"

等同于

myfile_path + '/*' + "/*.*[0-9][0-9][0-9][0-9]"

myfile_path + '/*/*.*[0-9][0-9][0-9][0-9]"

但是,即使使用recursive=False,该模式也会明确表示搜索myfile_path的子目录,而不搜索myfile_path本身的内容。说要搜索myfile_path的模式是

myfile_path + '/*.*[0-9][0-9][0-9][0-9]"

(此外,以这种方式构建glob是很危险的,因为myfile_path可能包含glob元字符。请记住在要从字面上进行匹配的组件上使用glob.escape,或者选择一种搜索机制,需要转义。)

答案 1 :(得分:1)

https://docs.python.org/3/library/glob.html

“如果递归为true,则模式**将匹配任何文件以及零个或多个目录和子目录。如果后跟os.sep,则仅目录和子目录匹配。”

因此,当递归设置为false时,**中的<myfile_path>/**/*.*[0-9][0-9][0-9][0-9]恰好匹配一级子目录。因为我假设/os.sep

答案 2 :(得分:0)

我已经使用if语句并重复其下的glob解决了我的问题。

    for junk in glob.glob(myfile_path + "/*.*[0-9][0-9][0-9][0-9]"):
        os.remove(os.path.join(myfile_path, junk))

    #The above code will delete the specified junk file within myfile_path.

    if self.recrsv.get()==1:
        for junk in glob.glob(myfile_path + '/**' + "/*.*[0-9][0-9][0-9][0-9]",
                              recursive=self.recrsv.get()):
            os.remove(os.path.join(myfile_path, junk)

    #The above code checks the recursive variable, and if true, will recursively delete the junk files.

如果我不使用if语句,而只是依靠glob自己的递归检查,那么即使recursive=False,垃圾文件也将从第一级子目录中删除。

我可能可以多整理一些代码,使其更具if-statement-intuitive的功能,但问题已解决。谢谢@Szellem和@ user2357112的努力。