上期答案

#   编写一个程序,用户输入关键字,查找当前文件内
# (如果当前文件夹内含有文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件
#   要求显示该文件所在的位置,以及关键字在本文中的位置(第几行、第几个字符)


import os

#查找文件
def search_file(filepath):
    all_files = os.walk(filepath) # 遍历top路径以下所有的子目录,返回一个三元组:(路径, [包含目录], [包含文件])
    list_txt_file = []# 存放txt格式的文件
    # 找到全部的文本文件
    for each_one in all_files:
        for each_file in each_one[2]:
            if os.path.splitext(each_file)[1] in ('.txt', '.TXT') :
                list_txt_file.append(os.path.join(each_one[0]+os.sep+each_file))
                #list_txt_file.append(os.path.join(os.getcwd() + os.sep + each_file))

    return list_txt_file

#查找关键字
def find_target(file, target):
    # 定义一个字典保存关键字在第几行和所在行的位置
    key_dict = dict()
    # 记录行数
    count = 0
    f = open(file)
    for each_line in f:
        count+=1
        #如果在某一行找到关键字,继续查找其位置
        if target in each_line:
            #定义位置
            position=[]
            # Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,
            # 则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。
            begin=each_line.find(target)
            while begin != -1:
                position.append(begin + 1)#用户角度是从1开始
                begin=each_line.find(target,begin+1 ) #从下一个位置继续查找
            key_dict[count]=position

    f.close()
    return key_dict


#打印关键字
def print_target(list_txt_file,target):
    for each_file in list_txt_file:
        key_dict=find_target(each_file,target)
        if key_dict:
            print('-----------------------------------')
            print('在文件【%s】中找到关键字【%s】'%(each_file, target))

        keys=key_dict.keys()
        keys=sorted(keys) #由于字典是无序的,这里对行数进行排序
        for each_key in keys:
            print('关键字出现在第%d行第%s个位置!'%(each_key,key_dict[each_key]))


target=input('输入您要查找的字符: ')
filepath=input('您要在哪个路径下进行搜索: ')
list_txt_file = search_file(filepath)

print_target(list_txt_file,target)

原文发布于微信公众号 - 软件测试经验与教训(udatest)

原文发表时间:2018-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人随笔

论 Java 的访问权限

Java中成员访问权限 Java中的访问权限控制符有四个: 作用域_____当前类____同一package___子孙类____其他package publi...

40380
来自专栏蓝天

sed 命令+正则表达式

sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道文件。sed可以随意编辑...

13320
来自专栏前端菜鸟变老鸟

ES6(二):Promise

ES6之前解决异步编程只能使用回调函数或事件,ES6中加入了 Promise,使得异步编程更加简洁直观和合理

12930
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列8

? 一、heap和stack有什么区别 栈是一种线形集合,其添加和删除元素的操作应在同一段完成。 栈按照后进先出的方式进行处理。 堆是栈的一个组成元素 ...

31650
来自专栏jessetalks

Javascript基础回顾 之(二) 作用域

参数传递的问题   在Javascript中所有的参数传递都是按值传递的。也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。...

28460
来自专栏农夫安全

【weakfilescan】敏感文件扫描工具

weakfilescan 基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括...

48080
来自专栏光变

3.3 ASM-方法-工具类

‘org.objectweb.asm.commons’包含了一些预定义的方法适配器,可以用来定义自己的适配器。 本节介绍三个工具类,并且会展示它们如何和3.2....

34900
来自专栏noteless

[二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

JVM全称是Java Virtual Machine  ,既然是虚拟机,他终归要运行在物理机上

29210
来自专栏苦逼的码农

Shell编程 --- 变量

(2).如果按作用范围的话,可分为自定义变量和环境变量(后面会将自定义变量和环境变量)。

11150
来自专栏landv

C语言_函数【转】

49930

扫码关注云+社区

领取腾讯云代金券