zoukankan      html  css  js  c++  java
  • 用 Python 实现文件查找

    用 Python 实现文件查找(BIF实现及队列实现)

    (1)利用内置函数实现文件查找

    1、功能:返回用户输入的文件的绝对路径

    2、设计思路:

    • (1)用户输入在哪个盘进行查找
    • (2)遍历此盘文件,若为目标文件则输出
    • (2)无此文件,则输出错误

    3、实验代码

    #查找某个目录下的目标文件
    import os       #引入操作系统模块
    import sys      #用于标准输入输出
        
    def search(path,name):
    
        for root, dirs, files in os.walk(path):  # path 为根目录
            if name in dirs or name in files:
                flag = 1      #判断是否找到文件
                root = str(root)
                dirs = str(dirs)
                return os.path.join(root, dirs)
        return -1
    
    
    path = input('请输入您要查找哪个盘中的文件(如:D:\)')
    print('请输入您要查找的文件名:')
    name = sys.stdin.readline().rstrip()  #标准输入,其中rstrip()函数把字符串结尾的空白和回车删除
    answer = search(path,name)
    if answer == -1:
        print("查无此文件")
    else:
        print(answer)
    
    

    4、运行结果展示

    1、无此文件

    2、有此文件

    (2)队列实现文件查找

    1、设计思路

    定义队列 ALLFiles 存储所有文件
    
    while ALLFiles 不为空
        if pop 为目录
            then 将目录内所有文件入队
            elesif pop 为文件
                then if 为目标文件
                        then break
        end
    输出路径
    

    2、实验代码

    #查找某个目录下的目标文件
    import os       #引入操作系统模块
    import sys      #用于标准输入输出
    import easygui as g     #引入图形用户界面
    
    def search(path1,name):
        Allfiles = []           #创建队列
        Allfiles.append(path1)
            
        while len(Allfiles) != 0:    #当队列中为空的时候跳出循环
            path =Allfiles.pop(0)    #从队列中弹出首个路径
            if os.path.isdir(path): #判断路径是否为目录
                ALLFilePath =os.listdir(path)    #若是目录,遍历将里面所有文件入队
                for line in ALLFilePath:
                    newPath =path +"\"+line   #形成绝对路径
                    Allfiles.append(newPath)
            else:   #如果是一个文件,判断是否为目标文件
                target = os.path.basename(path)
                if target == name:
                    return path
        return -1
    
    path = g.enterbox(msg='请输入文件目录(如:D:DEV)')
    name = g.enterbox(msg='请输入您要查找的文件名:')
    answer = search(path,name)
    if answer == -1:
        g.msgbox("查无此文件",'查找错误')
    else:
        g.msgbox(answer,'返回路径')
        
    
        
    

    3、运行结果

    • 有此文件


    • 无此文件


    遇到问题及解决方法

    • 编译错误

      解决方法:os.path.join() 的参数是 str 型, 添加代码 root = str(root) dirs = str(dirs)
    • 缩进错误

      解决方法:为了看看它能输出多少,我等待了五分钟,它还没有结束;结果把if name in dirs or name in files:语句重新打了一遍就可以了,应该是缩进的错误
    • 答案错误:把相同目录下的其他文件也输出出来了

      解决方法

      os.walk() 的 dirs 参数 才是返回目录,将print(os.path.join(root, files))改为print(os.path.join(root, dirs))
    • 答案错误:输出的路径不是绝对路径

      解决方法:将for root, dirs, files in os.walk('/'): # / 为根目录 改为 for root, dirs, files in os.walk(path): # path 为根目录

    心得体会

    • 代码虽然很短,但是完成它的过程很不容易
    • Python 中 循环和 if 分支后不用加大括号,但是需要 : ,而且缩进要十分注意
    • Python 不用定义类型并不代表变量没有类型,使用变量前需要先赋值
    • 序列包含 列表、元组和字符串
      列表主要标志是[ ],是一个打了激素的数组,什么东西都能往里装
      元组和字符串都是戴上了枷锁的列表;元组标志是( ) 和 ,,其元素不可改变;字符串不能轻易修改
      三者共同点:
      1、都可以通过索引得到一个元素
      2、默认索引值从零开始
      3、可以通过分片的方式得到一个范围内元素的集合
      4、有很多共同操作符(重复操作符、拼接操作符、成员关系操作符等)
    • Python 中有很多已经定义好的 BIF ,编写代码时很方便
    • 经常会把输出 print() 打成 printf()
  • 相关阅读:
    简单的分页存储过程,Json格式日期转换为一般日期
    事件的那些事
    关于1Byte 1K 1M 1G(换算)
    VS自带WCF测试客户端简单介绍
    “System.Transactions.Diagnostics.DiagnosticTrace”的类型初始值设定项引发异常[WCF]
    周末大放送网站图片上传,水印,预览,截图
    FIREDAC驱动ORACLE的配置
    匿名方法实现多线程同步到主线程执行
    DELPHI跨平台的临界替代者
    三层数据库设计注意事项
  • 原文地址:https://www.cnblogs.com/Lclkris/p/8724711.html
Copyright © 2011-2022 走看看