Python 搜索未知扩展名的文件
Python Search for File Unknown Extension
python 的新手,如果这是一个简单的问题,我们深表歉意。我搜索了一下,发现很多关于搜索名称和文件扩展名未知但名称和扩展名未知的文件的搜索,如果没有人介意,我可以使用一些帮助让我的代码 运行正确。
我正在尝试编写的是一个 Python 函数,它接受一个目录和名称,然后 returns 一个列表,其中包含所有文件(具有任何文件扩展名)和目录的路径用那个名字。 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
目前,如果文件的副本位于我的程序目录中,我只能找到结果。如果那里没有副本,它就找不到文件,即使我的驱动器上有两个副本。
我希望有人能向我解释为什么会这样,以及如何更正它以便它总能找到我正在搜索的文件。
您为什么重新搜索?这意味着当 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
并在 yield
ing 之前设置为 True
的简单布尔值可以让您进行相同的检查,尽管通常实用程序函数不需要担心本身就是这样的东西。
python 的新手,如果这是一个简单的问题,我们深表歉意。我搜索了一下,发现很多关于搜索名称和文件扩展名未知但名称和扩展名未知的文件的搜索,如果没有人介意,我可以使用一些帮助让我的代码 运行正确。
我正在尝试编写的是一个 Python 函数,它接受一个目录和名称,然后 returns 一个列表,其中包含所有文件(具有任何文件扩展名)和目录的路径用那个名字。 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
目前,如果文件的副本位于我的程序目录中,我只能找到结果。如果那里没有副本,它就找不到文件,即使我的驱动器上有两个副本。
我希望有人能向我解释为什么会这样,以及如何更正它以便它总能找到我正在搜索的文件。
您为什么重新搜索?这意味着当 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
并在 yield
ing 之前设置为 True
的简单布尔值可以让您进行相同的检查,尽管通常实用程序函数不需要担心本身就是这样的东西。