自从过去两周以来,我一直使用Python进行编码,并且很新。
我编写了一个代码来模仿“查找”命令在* NIX系统中的工作方式。我的代码工作正常,因为没有那么深的目录但如果我从“根”目录开始搜索,则需要花费太多时间并且处理器会升温:另一方面,使用“find”cmd需要大约8秒。 / p>
嘿,我知道我现在在Python中有点像菜鸟,但是任何提高搜索效率的暗示都会受到高度赞赏。
这是我写的:
#!/usr/bin/python3
import os
class srchx:
file_names = []
is_prohibit = False
def show_result(self):
if(self.is_prohibit):
print("some directories were denied read-access")
print("\nsearch returned {0} result(s)".format(len(self.file_names)))
for _file in self.file_names:
print(_file)
def read_dir(self, cur_dir, srch_name, level):
try:
listing = os.listdir(cur_dir)
except:
self.is_prohibit = True
return
dir_list = []
#print("-"*level+cur_dir)
for entry in listing:
if(os.path.isdir(cur_dir+"/"+entry)):
dir_list.append(entry)
else:
if(srch_name == entry):
self.file_names.append(cur_dir+"/"+entry)
for _dir in dir_list:
new_dir = cur_dir + "/" + _dir
self.read_dir(new_dir, srch_name, level+1)
if(level == 0):
self.show_result()
def __init__(self, dir_name=os.getcwd()):
srch_name = ""
while(len(srch_name) == 0):
srch_name = input("search for: ")
self.read_dir(dir_name, srch_name, 0)
def main():
srch = srchx()
if (__name__ == "__main__"):
main()
看一看,请帮我解决这个问题。
答案 0 :(得分:2)
有一个名为os.walk()的内置目录浏览框架,但即使是os.walk()也很慢,如果你想更快地浏览,你需要访问操作系统文件浏览器。
scandir是一种解决方案。答案 1 :(得分:0)
用户1767754说了什么。使用您调用的方法无法真正提高速度。但是,os.walk()的效率要高一些。我从未使用过scandir(或pypi)所以我无法发表评论。
BTW,对于一个菜鸟而言,这是一个相当好看的代码,Marty!但是它有几个问题。这样初始化file_names
和is_prohibit
并不是一个好主意,因为它会使class variables成为__init__
;在srch_name
初始化它们。
您应该在课堂外阅读__init__
并将其传递给您的类构造函数。你可以通过使其成为{{1}}的arg来实现,如上面的链接所述。
通常很好的策略是在代码的最外层处理用户输入(实际时),而不是在代码的内部部分处理。我喜欢将我的用户输入例程视为边界保护,只允许良好的输入到我的代码的内部密室。用户是不可预测的小动物,并且不知道他们将会遇到什么样的恶作剧。 :)