使用Python搜索文件系统

时间:2014-09-14 11:55:20

标签: python python-3.x

自从过去两周以来,我一直使用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()

看一看,请帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

有一个名为os.walk()的内置目录浏览框架,但即使是os.walk()也很慢,如果你想更快地浏览,你需要访问操作系统文件浏览器。

<强> https://pypi.python.org/pypi/scandir

scandir是一种解决方案。

答案 1 :(得分:0)

用户1767754说了什么。使用您调用的方法无法真正提高速度。但是,os.walk()的效率要高一些。我从未使用过scandir(或pypi)所以我无法发表评论。

BTW,对于一个菜鸟而言,这是一个相当好看的代码,Marty!但是它有几个问题。

  1. 这样初始化file_namesis_prohibit并不是一个好主意,因为它会使class variables成为__init__;在srch_name初始化它们。

  2. 您应该在课堂外阅读__init__并将其传递给您的类构造函数。你可以通过使其成为{{1}}的arg来实现,如上面的链接所述。

  3. 通常很好的策略是在代码的最外层处理用户输入(实际时),而不是在代码的内部部分处理。我喜欢将我的用户输入例程视为边界保护,只允许良好的输入到我的代码的内部密室。用户是不可预测的小动物,并且不知道他们将会遇到什么样的恶作剧。 :)