鱼C论坛

 找回密码
 立即注册
查看: 879|回复: 14

[已解决]零基础python-关键字查找

[复制链接]
发表于 2020-5-26 10:16:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#第一步输入关键字与选择
#第二步找到所有txt文件
#第三步在txt文件中逐行查找关键字,并找到出现的行数和每行出现的位置
#第四步按格式打印
import os
def find_word(key_word,choice):
       
    txt_file = []    #用来储存找到的txt文件
    for root,dirs,files in os.walk(os.curdir):  #遍历当前工作目录下的所有子目录,返回一个三元组
        for each_file in files:
            ext = os.path.splitext(each_file)[1]   #分割出每个文件的后缀名
            if ext == "txt":
                txt_file.append(each_file)

    
    for one_file in txt_file:            
        pos_dict = pos_word(one_file,key_word)
        if pos_dict:
            print("=================================================================================")
            print("在文件【%s】中找到关键字【%s】"%(root+os.sep+one_file,key_word))
            if detail in ['YES', 'Yes', 'yes']:
                print_pos(pos_dict)


def pos_word(one_file,key_word):   #在txt文件中逐行查找关键字
    
    f = open(one_file)
    count = 0                  #统计行数,并且行与每行出现位置一一对应,所以引入字典来存储
    pos_dict = dict()
    for each_line in f:
        count += 1
        if key_word in each_line:
            pos_dict[count] = pos(each_line,key_word)

    f.close()
    return pos_dict

def pos(each_line,key_word):
    pos = []
    begin = each_line.find(key_word)     #检测关键字是否在字符串中,如果在则返回索引值,否则返回-1
    while begin != -1:               #关键字在字符串中时,迭代找每行出现的位置
        pos.append(begin+1)          #人从第一个位置找
        begin = each_line.find(key_word,begin+1)   #在该行从下一个位置继续找
    return pos

def print_pos(pos_dict):
    for one_key in pos_dict.keys():
        print("关键字出现在第%s行,第[%s]个位置"%(one_key,pos.dict[one_key]))

key_word = input("请将该脚本放于待查找的文件夹内,请输入关键字:")
choice = input("请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):"%key_word)
find_word(key_word,choice)
结果为:
>>> 
=== RESTART: C:/Users/admin/Desktop/课后练习/008-查找当前目录下含关键字文件中关键字出现的行数与位置.py ===
请将该脚本放于待查找的文件夹内,请输入关键字:我
请问是否需要打印关键字【我】在文件中的具体位置(YES/NO):YES
>>> 
该文件中含我关键字的txt文件
最佳答案
2020-5-26 10:41:11
代码错的地方好多,还有没有对应打印路径,文件路径打印的不正确,

这里代码应该是你大意打错了变量名吧:
print("关键字出现在第%s行,第[%s]个位置"%(one_key,pos.dict[one_key]))
应该是:
print("关键字出现在第%s行,第[%s]个位置"%(one_key,pos_dict[one_key]))
的吧....反正很多错误。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-26 10:22:43 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-26 10:24 编辑

没错 是我理解错了  我再看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 10:31:45 | 显示全部楼层
这个:
if ext == "txt":
改成:
if ext == ".txt":
这个:
if detail in ['YES', 'Yes', 'yes']:
改成:
f choice in ['YES', 'Yes', 'yes']:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 10:41:11 | 显示全部楼层    本楼为最佳答案   
代码错的地方好多,还有没有对应打印路径,文件路径打印的不正确,

这里代码应该是你大意打错了变量名吧:
print("关键字出现在第%s行,第[%s]个位置"%(one_key,pos.dict[one_key]))
应该是:
print("关键字出现在第%s行,第[%s]个位置"%(one_key,pos_dict[one_key]))
的吧....反正很多错误。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 10:55:00 | 显示全部楼层
确实,太粗心了  ,回头看还发现不了
谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 11:06:31 | 显示全部楼层
莫待无花空折枝 发表于 2020-5-26 10:55
确实,太粗心了  ,回头看还发现不了
谢谢大佬


没点回复我刚刚都没看见你发我消息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 13:04:20 | 显示全部楼层
Twilight6 发表于 2020-5-26 11:06
没点回复我刚刚都没看见你发我消息
for each_txt_file in txt_files:
        key_dict = search_in_file(each_txt_file, key)
        if key_dict:
            print('================================================================')
            print('在文件【%s】中找到关键字【%s】' % (each_txt_file, key))
            if detail in ['YES', 'Yes', 'yes']:
                print_pos(key_dict)
小甲鱼 这一步就能打印
请将该脚本放于待查找的文件夹内,请输入关键字:我
请问是否需要打印关键字【我】在文件中的具体位置(YES/NO):YES
================================================================
在文件【C:\Users\admin\Desktop\课后练习\record2.txt】中找到关键字【我】
关键字出现在第 3 行,第 [5] 个位置。
关键字出现在第 5 行,第 [18, 29] 个位置。
关键字出现在第 9 行,第 [10] 个位置。
关键字出现在第 10 行,第 [13] 个位置。
关键字出现在第 15 行,第 [22] 个位置。
关键字出现在第 16 行,第 [9, 14] 个位置。
关键字出现在第 17 行,第 [8] 个位置。
关键字出现在第 30 行,第 [11] 个位置。
关键字出现在第 31 行,第 [12] 个位置。
================================================================
在文件【C:\Users\admin\Desktop\课后练习\something2.txt】中找到关键字【我】
关键字出现在第 4 行,第 [1] 个位置。
关键字出现在第 6 行,第 [5] 个位置。
关键字出现在第 7 行,第 [9] 个位置。
关键字出现在第 8 行,第 [1] 个位置。
关键字出现在第 10 行,第 [5] 个位置。
关键字出现在第 14 行,第 [1] 个位置。
================================================================
在文件【C:\Users\admin\Desktop\课后练习\rem\record2.txt】中找到关键字【我】
关键字出现在第 3 行,第 [5] 个位置。
关键字出现在第 5 行,第 [18, 29] 个位置。
关键字出现在第 9 行,第 [10] 个位置。
关键字出现在第 10 行,第 [13] 个位置。
关键字出现在第 15 行,第 [22] 个位置。
关键字出现在第 16 行,第 [9, 14] 个位置。
关键字出现在第 17 行,第 [8] 个位置。
关键字出现在第 30 行,第 [11] 个位置。
关键字出现在第 31 行,第 [12] 个位置。
我这么写,结果是这样的
请将该脚本放于待查找的文件夹内,请输入关键字:我
请问是否需要打印关键字【我】在文件中的具体位置(YES/NO):YES
=================================================================================
在文件【record2.txt】中找到关键字【我】
关键字出现在第3行,第[[5]]个位置
关键字出现在第5行,第[[18, 29]]个位置
关键字出现在第9行,第[[10]]个位置
关键字出现在第10行,第[[13]]个位置
关键字出现在第15行,第[[22]]个位置
关键字出现在第16行,第[[9, 14]]个位置
关键字出现在第17行,第[[8]]个位置
关键字出现在第30行,第[[11]]个位置
关键字出现在第31行,第[[12]]个位置
=================================================================================
在文件【something2.txt】中找到关键字【我】
关键字出现在第4行,第[[1]]个位置
关键字出现在第6行,第[[5]]个位置
关键字出现在第7行,第[[9]]个位置
关键字出现在第8行,第[[1]]个位置
关键字出现在第10行,第[[5]]个位置
关键字出现在第14行,第[[1]]个位置
=================================================================================
在文件【record2.txt】中找到关键字【我】
关键字出现在第3行,第[[5]]个位置
关键字出现在第5行,第[[18, 29]]个位置
关键字出现在第9行,第[[10]]个位置
关键字出现在第10行,第[[13]]个位置
关键字出现在第15行,第[[22]]个位置
关键字出现在第16行,第[[9, 14]]个位置
关键字出现在第17行,第[[8]]个位置
关键字出现在第30行,第[[11]]个位置
关键字出现在第31行,第[[12]]个位置
>>> 
又或者这么写
for one_file in txt_file:            
        pos_dict = pos_word(one_file,key_word)
        if pos_dict:
            print("=================================================================================")
            print("在文件【%s%s】中找到关键字【%s】"%(root,one_file,key_word))
            if choice in ['YES', 'Yes', 'yes']:
                print_pos(pos_dict)
结果是这样的,
请将该脚本放于待查找的文件夹内,请输入关键字:我
请问是否需要打印关键字【我】在文件中的具体位置(YES/NO):YES
=================================================================================
在文件【.\remrecord2.txt】中找到关键字【我】
关键字出现在第3行,第[[5]]个位置
关键字出现在第5行,第[[18, 29]]个位置
关键字出现在第9行,第[[10]]个位置
关键字出现在第10行,第[[13]]个位置
关键字出现在第15行,第[[22]]个位置
关键字出现在第16行,第[[9, 14]]个位置
关键字出现在第17行,第[[8]]个位置
关键字出现在第30行,第[[11]]个位置
关键字出现在第31行,第[[12]]个位置
=================================================================================
在文件【.\remsomething2.txt】中找到关键字【我】
关键字出现在第4行,第[[1]]个位置
关键字出现在第6行,第[[5]]个位置
关键字出现在第7行,第[[9]]个位置
关键字出现在第8行,第[[1]]个位置
关键字出现在第10行,第[[5]]个位置
关键字出现在第14行,第[[1]]个位置
=================================================================================
在文件【.\remrecord2.txt】中找到关键字【我】
关键字出现在第3行,第[[5]]个位置
关键字出现在第5行,第[[18, 29]]个位置
关键字出现在第9行,第[[10]]个位置
关键字出现在第10行,第[[13]]个位置
关键字出现在第15行,第[[22]]个位置
关键字出现在第16行,第[[9, 14]]个位置
关键字出现在第17行,第[[8]]个位置
关键字出现在第30行,第[[11]]个位置
关键字出现在第31行,第[[12]]个位置
>>> 
问题在哪里呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 13:08:36 | 显示全部楼层
莫待无花空折枝 发表于 2020-5-26 13:04
小甲鱼 这一步就能打印

我这么写,结果是这样的
#第一步输入关键字与选择
#第二步找到所有txt文件
#第三步在txt文件中逐行查找关键字,并找到出现的行数和每行出现的位置
#第四步按格式打印
import os
def find_word(key_word,choice):
       
    txt_file = []    #用来储存找到的txt文件
    for root,dirs,files in os.walk(os.curdir):  #遍历当前工作目录下的所有子目录,返回一个三元组
        for each_file in files:
            ext = os.path.splitext(each_file)[1]   #分割出每个文件的后缀名
            if ext == ".txt":
                txt_file.append(each_file)

    
    for one_file in txt_file:            
        pos_dict = pos_word(one_file,key_word)
        if pos_dict:
            print("=================================================================================")
            print("在文件【%s】中找到关键字【%s】"%(one_file,key_word))
            if choice in ['YES', 'Yes', 'yes']:
                print_pos(pos_dict)


def pos_word(one_file,key_word):   #在txt文件中逐行查找关键字
    f = open(one_file)
    count = 0                  #统计行数,并且行与每行出现位置一一对应,所以引入字典来存储
    pos_dict = dict()
    for each_line in f:
        count += 1
        if key_word in each_line:
            pos_dict[count] = pos(each_line,key_word)

    f.close()
    return pos_dict

def pos(each_line,key_word):
    pos = []
    begin = each_line.find(key_word)     #检测关键字是否在字符串中,如果在则返回索引值,否则返回-1
    while begin != -1:               #关键字在字符串中时,迭代找每行出现的位置
        pos.append(begin+1)          #人从第一个位置找
        begin = each_line.find(key_word,begin+1)   #在该行从下一个位置继续找
    return pos

def print_pos(pos_dict):
    for one_key in pos_dict.keys():
        print("关键字出现在第%s行,第[%s]个位置"%(one_key,pos_dict[one_key]))

key_word = input("请将该脚本放于待查找的文件夹内,请输入关键字:")
choice = input("请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):"%key_word)
find_word(key_word,choice)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 13:17:20 | 显示全部楼层
print("在文件【%s】中找到关键字【%s】" % (os.getcwd()+os.sep+one_file, key_word))
这样试试看

下面这个也改下:
print("关键字出现在第%s行,第[%s]个位置" % (one_key, pos_dict[one_key][0]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 13:40:40 | 显示全部楼层
Twilight6 发表于 2020-5-26 13:17
这样试试看

下面这个也改下:

大佬 你说的第一个我试过,打印出来为
请将该脚本放于待查找的文件夹内,请输入关键字:我
请问是否需要打印关键字【我】在文件中的具体位置(YES/NO):YES
=================================================================================
在文件【C:\Users\admin\Desktop\课后练习\record2.txt】中找到关键字【我】
关键字出现在第3行,第[[5]]个位置
关键字出现在第5行,第[[18, 29]]个位置
关键字出现在第9行,第[[10]]个位置
关键字出现在第10行,第[[13]]个位置
关键字出现在第15行,第[[22]]个位置
关键字出现在第16行,第[[9, 14]]个位置
关键字出现在第17行,第[[8]]个位置
关键字出现在第30行,第[[11]]个位置
关键字出现在第31行,第[[12]]个位置
=================================================================================
在文件【C:\Users\admin\Desktop\课后练习\something2.txt】中找到关键字【我】
关键字出现在第4行,第[[1]]个位置
关键字出现在第6行,第[[5]]个位置
关键字出现在第7行,第[[9]]个位置
关键字出现在第8行,第[[1]]个位置
关键字出现在第10行,第[[5]]个位置
关键字出现在第14行,第[[1]]个位置
=================================================================================
在文件【C:\Users\admin\Desktop\课后练习\record2.txt】中找到关键字【我】
关键字出现在第3行,第[[5]]个位置
关键字出现在第5行,第[[18, 29]]个位置
关键字出现在第9行,第[[10]]个位置
关键字出现在第10行,第[[13]]个位置
关键字出现在第15行,第[[22]]个位置
关键字出现在第16行,第[[9, 14]]个位置
关键字出现在第17行,第[[8]]个位置
关键字出现在第30行,第[[11]]个位置
关键字出现在第31行,第[[12]]个位置
>>> 
问题是record.txt文件有两个 ,有一个在子目录里,没有打印出来
第二个不用改,因为题目是要求打印一行里关键字出现的所有位置而不是第一个位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 13:42:33 | 显示全部楼层
莫待无花空折枝 发表于 2020-5-26 13:40
大佬 你说的第一个我试过,打印出来为

问题是record.txt文件有两个 ,有一个在子目录里,没有打印出来 ...


第二个你理解错了 第二个你没改 你打印的结果是两个中括号你没发现嘛

或者你把字符串里面的 [] 去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 13:44:12 | 显示全部楼层
Twilight6 发表于 2020-5-26 11:06
没点回复我刚刚都没看见你发我消息

我不知道是不是我用的微软浏览器的缘故  每一次刷新才能显示有新的消息提醒  所以你每一次回复问题 我都回答的有点慢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 13:45:01 | 显示全部楼层
莫待无花空折枝 发表于 2020-5-26 13:40
大佬 你说的第一个我试过,打印出来为

问题是record.txt文件有两个 ,有一个在子目录里,没有打印出来 ...

你开始没说清楚问题啊  全部都是我自己找异同点找出来的  我也没观察那么 仔细 看到路径问题  我只看到你的没打印路径 我以为你问的是这个问题。。。下次请描述好问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 13:45:19 | 显示全部楼层
Twilight6 发表于 2020-5-26 13:42
第二个你理解错了 第二个你没改 你打印的结果是两个中括号你没发现嘛

或者你把字符串里面的 [] 去 ...

对对对   害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 13:46:40 | 显示全部楼层
Twilight6 发表于 2020-5-26 13:45
你开始没说清楚问题啊  全部都是我自己找异同点找出来的  我也没观察那么 仔细 看到路径问题  我只看到你 ...

好的 好的 好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-21 04:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表