Python - Os.walk循环遍历不同驱动器中的目录列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - Os.walk循环遍历不同驱动器中的目录列表相关的知识,希望对你有一定的参考价值。

我是一名Python初学者,正在寻找一些使用os.walk搜索目录列表的帮助。

我的想法是从SQL数据库中提取目录列表,这些目录可能会有不同的驱动器号或甚至是UNC路径。我需要做的是搜索这些目录以查找特定名称的文件并将其删除。由于文件可能位于任何目录中,因此需要搜索所有目录。目录列表是不确定的,所以我的想法是将它们存储到列表中并让os.walk查看该列表中的所有目录。

def get_location():
    c.execute('SELECT ADDRESS FROM DIRECTORY')
    data = c.fetchall()
    SQLlist = [row for row in data]
    return SQLlist


addresslist = get_location()


def FileDeleter():
    for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False) for path in (str(addresslist[0:]))):
        for file in files:
            if correctID in file:
                if file.endswith('.custextn'):
                    os.remove(os.path.join(root, file))

这是代码目前的情况,但以前我尝试过:

    for root, dirs, files in os.walk(addresslist[0:], topdown=False):

    for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False)):

似乎os.walk不接受列表(/元组)。如果我设置地址列表[0]或地址列表[1]它实际上有效,但是因为我不知道有多少地址可能存在,遗憾的是我不能将X地址存储为单独的变量并复制该功能。

运行代码时出现的错误是:

'TypeError:预期的str,bytes或os.PathLike对象,不是list'

最后,我使用硬编码的地址列表进行测试,以排除从数据库中提取列表的问题,例如:

addresslist = ['C:\Subfolder1\Subfolder2', 'D:\Subfolder1\Subfolder2']

并且,由于解包错误:

x,y = ['C:\Subfolder1\Subfolder2', 'D:\Subfolder1\Subfolder2']

谢谢

答案

你的第一个for循环不能达到你想要的效果。它很接近,但并不完全。

for root, dirs, files in chain.from_iterable(os.walk(addresslist[0:], topdown=False) for path in (str(addresslist[0:])))

你的循环当前正在做的是将你的addresslist转换为字符串。然后,您实际上迭代该字符串中的每个字符,该字符串放入path变量中。然后你试图链接一系列os.walk发电机。但os.walk需要一条路。您也没有在代码中的任何其他位置使用该path变量。

这应该是:

for path in addresslist:
   # it looks like you are worried that not all paths will be strings
   # if that's really a concern, then leave this next line.
   # Otherwise, I think it is safe to delete it
   path = str(path) 
   for root, dirs, files in os.walk(path, topdown=False):

这将从addresslist(这是你想要搜索的路径)中取出每个元素并对其进行os.walk。我认为你根本不需要在这里使用chain

如果你想使用chain(没有必要),你可以按照这篇SO帖子提供的大纲:os.walk multiple directories at once

for root, dirs, files in chain.from_iterable(os.walk(str(path)) for path in addresslist):

你应该做的另一件事是让addresslist成为传递给你的函数的参数。

def FileDeleter(addresslist):
   # your function code here
# then you need to actually call the function
addresses = get_locations()
FileDeleter(addresses)

随着代码变得更加复杂,依赖全局变量会给您带来很多麻烦。

另一答案

我现在有这个工作,想确认我做了什么。

有两个问题。我需要@ TheF1rstPancake和@Michael Butscher建议的额外for循环。

第二个问题是从数据库中提取目录列表。

def get_location():
    c.execute('SELECT ADDRESS FROM DIRECTORY')
    data = c.fetchall()
    SQLlist = [row for row in data]
    return SQLlist

我正在使用上面但发现当你打印(数据)时,你得到了一个元组元组或元组列表,它无法循环通过os.walk来使用。结果看起来像

[('C:\Subfolder1\Subfolder2',), ('D:\Subfolder1\Subfolder2',)]

我使用的解决方案如下

def get_location():
    c.execute('SELECT ADDRESS FROM DIRECTORY')
    data = c.fetchall()
    SQLlist = []
    for row in range(len(data)):
        SQLlist.append(data[row][0])
    return SQLlist

这现在给我列表:

['C:\Subfolder1\Subfolder2', 'D:\Subfolder1\Subfolder2']

通过额外的for循环运行此列表时,os.walk现在可以正确搜索所有目录。

感谢大家的帮助,非常感谢!

以上是关于Python - Os.walk循环遍历不同驱动器中的目录列表的主要内容,如果未能解决你的问题,请参考以下文章

Python os.walk() 方法遍历文件目录

python笔记4-遍历文件夹目录os.walk()

Python os.walk() 遍历出当前目录下的文件夹和文件

OS.Walk For Raspbian 上的循环难题

python遍历文件夹中所有文件夹和文件,os.walk

python 使用python os.walk遍历所有子目录