我是一名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']
由于
答案 0 :(得分:0)
你的第一个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)
当代码变得更复杂时,依赖全局变量可能会给您带来很多麻烦。
答案 1 :(得分:0)
我现在有这个工作,想确认我做了什么。
有两个问题。我需要@ 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现在可以正确搜索所有目录。
感谢大家的帮助,非常感谢!