鱼C论坛

 找回密码
 立即注册
查看: 3573|回复: 6

[已解决]python查找.txt文件中想要的关键字的准确位置

[复制链接]
发表于 2020-6-19 09:31:26 | 显示全部楼层 |阅读模式

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

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

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

我写到一半了,在.txt文件中找到关键字的准确位置这里卡住了,我能找的关键字在第几行,但是怎么找他在第几行的第几个位置呢




这是我写了一半的代码
import os
def search_text(start_dir,aim):

    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir):

        if (behind = os.path.splitext(each_file)[1]) == '.txt':#判断后缀名是否为.txt

            search_aim(each_file)#调用在.txt文件中找准确位置的函数,但是我没写,不知道这个函数怎么写
            
        if os.path.isdir(erch_file):#判断是否为文件夹,是的话进文件夹查找
            
            search_text(each_file,aim)

            os.chdir(os.pardir)#返回上级目录


def search_aim(each_file):

    
    

aim = input("请输入要查找的内容")
start_dir = input("情输入开始查找的路径")

这个是答案,看着好麻烦 ,好多看不懂的
import os

 

def print_pos(key_dict):

    keys = key_dict.keys()

    keys = sorted(keys) # 由于字典是无序的,我们这里对行数进行排序

    for each_key in keys:

        print('关键字出现在第 %s 行,第 %s 个位置。' % (each_key, str(key_dict[each_key])))

 

 

def pos_in_line(line, key):

    pos = []

    begin = line.find(key)

    while begin != -1:

        pos.append(begin + 1) # 用户的角度是从1开始数

        begin = line.find(key, begin+1) # 从下一个位置继续查找

 

    return pos

 

 

def search_in_file(file_name, key):

    f = open(file_name)

    count = 0 # 记录行数

    key_dict = dict() # 字典,用户存放key所在具体行数对应具体位置

 

    for each_line in f:

        count += 1

        if key in each_line:

            pos = pos_in_line(each_line, key) # key在每行对应的位置

            key_dict[count] = pos

 

    f.close()

    return key_dict

 

 

def search_files(key, detail):    

    all_files = os.walk(os.getcwd())

    txt_files = []

 

    for i in all_files:

        for each_file in i[2]:

            if os.path.splitext(each_file)[1] == '.txt': # 根据后缀判断是否文本文件

                each_file = os.path.join(i[0], each_file)

                txt_files.append(each_file)

 

    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)

 

 

key = input('请将该脚本放于待查找的文件夹内,请输入关键字:')

detail = input('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):' % key)

search_files(key, detail)

接下来这个是期望的运行结果
最佳答案
2020-6-19 11:53:25
小甲鱼的铁粉 发表于 2020-6-19 11:51
嗯,改了一下
现在的代码是


文件夹里面的 txt 文件编码重新设置下就好了:

第一步:

                               
登录/注册后可看大图



第二步:

                               
登录/注册后可看大图
20181021150316469.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-19 09:32:31 | 显示全部楼层
这个帖子太长了,麻烦鱼油们看一下吧,辛苦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 09:40:21 | 显示全部楼层
def search_in_file(file_name, key):

    f = open(file_name)

    count = 0 # 记录行数

    key_dict = dict() # 字典,用户存放key所在具体行数对应具体位置



    for each_line in f:

        count += 1

        if key in each_line:

            pos = pos_in_line(each_line, key) # key在每行对应的位置

            key_dict[count] = pos

答案里这一段不是写的很明确了么?找到文件后,用count记录行数,逐行查找并记录位置,找到后以字典的形式存储{[count:pos]}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 09:50:41 | 显示全部楼层
本帖最后由 yhhpf 于 2020-6-19 09:51 编辑
def search_in_file(file_name, key):

    f = open(file_name)

    count = 0 # 记录行数

    key_dict = dict() # 字典,用户存放key所在具体行数对应具体位置



    for each_line in f:#可以理解为:将文件看做一个由多行组成的列表,让each_line代表其中的行,循环每一行

        count += 1#每次循环count增加1,用以记录第几行

        if key in each_line:#判断kye是否在该行内

            pos = pos_in_line(each_line, key) # key在每行对应的位置 #如果在了,则将key在该行所在的位置赋值给pos

                  key_dict[count] = pos
#字典记录对应行数以及位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 11:45:38 | 显示全部楼层


你的代码错了俩个地方:
if (behind = os.path.splitext(each_file)[1]) == '.txt':


还有这打错变量名了,each_file:
if os.path.isdir(erch_file):

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

使用道具 举报

 楼主| 发表于 2020-6-19 11:51:32 | 显示全部楼层
Twilight6 发表于 2020-6-19 11:45
你的代码错了俩个地方:

嗯,改了一下
现在的代码是
import os
def search_file(start_dir,aim):

    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir):

        behind = os.path.splitext(each_file)[1]

        if behind  == '.txt':#判断后缀名是否为.txt
            
            search_text(each_file,aim)#调用在.txt文件中找准确位置的函数,但是我没写,不知道这个函数怎么写
            
        if os.path.isdir(each_file):#判断是否为文件夹,是的话进文件夹查找

    
            search_file(each_file,aim)

            os.chdir(os.pardir)#返回上级目录


def search_text(each_file,aim):
    count = 1
    print(each_file)
    f1 = open(each_file,encoding = 'utf-8')
    
    for each_line in f1:
        if aim in each_line:
           print("在%s文件中的%d行找到了%s" % (each_file,count,aim))
        count += 1

    f1.close()
    

aim = input("请输入要查找的内容")
start_dir = input("情输入开始查找的路径")
search_file(start_dir,aim)
报错了,好像是格式不对
Traceback (most recent call last):
  File "C:\Users\86188\Desktop\1111.py", line 37, in <module>
    search_file(start_dir,aim)
  File "C:\Users\86188\Desktop\1111.py", line 17, in search_file
    search_file(each_file,aim)
  File "C:\Users\86188\Desktop\1111.py", line 12, in search_file
    search_text(each_file,aim)#调用在.txt文件中找准确位置的函数,但是我没写,不知道这个函数怎么写
  File "C:\Users\86188\Desktop\1111.py", line 27, in search_text
    for each_line in f1:
  File "C:\Users\86188\AppData\Local\Programs\Python\Python38-32\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 153: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 11:53:25 | 显示全部楼层    本楼为最佳答案   
小甲鱼的铁粉 发表于 2020-6-19 11:51
嗯,改了一下
现在的代码是


文件夹里面的 txt 文件编码重新设置下就好了:

第一步:

                               
登录/注册后可看大图



第二步:

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 13:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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