python的新手,如果这是一个简单的问题,请道歉。我搜索了一下,发现有很多搜索具有未知名称和已知文件扩展名的文件,但不是已知名称和未知扩展名,如果没有人介意我可以使用一点帮助让我的代码正确运行。< / p>
我正在尝试编写的是一个接受目录和名称的Python函数,然后返回一个列表,其中包含所有文件(带有任何文件扩展名)的路径和具有该名称的目录。 directory参数将是计算机驱动器(例如C或F),name参数是要搜索的文件的名称(不带扩展名)。
以下是我的代码:
import os
import glob
def search_directory(directory,name):
result = []
for root,dirs,files in os.walk(directory,topdown=True):
files_lower = []
dirs_lower = []
for i in files:
files_lower.append(i.lower())
for i in dirs:
dirs_lower.append(i.lower())
for i in glob.glob(name + '.*'):
if i.lower() in files_lower:
result.append(root + "\\" + files[files_lower.index(i.lower())])
if name.lower() in dirs_lower:
result.append(root + "\\" + dirs[dirs_lower.index(name.lower())])
if (len(result) == 0):
result.append("fileNotFound")
return result
目前,如果该文件的副本位于我的程序目录中,我只能找到结果。如果那里没有副本,即使我的驱动器上有两个副本,它也找不到该文件。
我希望有人可以向我解释为什么会这样,以及如何纠正它,以便始终找到我正在搜索的文件。
答案 0 :(得分:2)
为什么要重新搜索?这意味着当os.walk
为您提供名称时,您最终会重复重新扫描目录,因此您只需使用os.path.splitext
直接检查它们即可进行扩展分割。您还可以通过使其成为生成器函数来简化逻辑,因此您可以在找到文件时生成文件,更快地获得结果并避免在处理每个文件名时丢弃不必要的状态:
def search_directory(directory,name):
name = name.lower() # Convert up front in case it's pass mixed case
for root, dirs, files in os.walk(directory,topdown=True):
for e in files + dirs:
if os.path.splitext(e)[0].lower() == name:
yield os.path.join(root, e)
这使它成为一个生成器(如果你想要一个列表,你可以在list
构造函数中包装调用以实现生成器),所以它不会告诉你是否没有点击,但调用者(或转换为list
的包装函数)可以自己确定。如果需要,初始化为False
的简单布尔值会在True
之前设置为yield
,但可以让您进行相同的检查,但通常不需要实用程序功能用这样的东西担心自己。