小甲鱼的铁粉 发表于 2020-6-19 09:31:26

python查找.txt文件中想要的关键字的准确位置

编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件.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)) == '.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("情输入开始查找的路径")


这个是答案,看着好麻烦{:10_297:} ,好多看不懂的

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)))





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 = 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:

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

                each_file = os.path.join(i, 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 09:32:31

这个帖子太长了,麻烦鱼油们看一下吧,辛苦了{:10_281:}

yhhpf 发表于 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 = pos

答案里这一段不是写的很明确了么?找到文件后,用count记录行数,逐行查找并记录位置,找到后以字典的形式存储{}

yhhpf 发表于 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 = pos#字典记录对应行数以及位置

Twilight6 发表于 2020-6-19 11:45:38



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

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

小甲鱼的铁粉 发表于 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)

      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

Twilight6 发表于 2020-6-19 11:53:25

小甲鱼的铁粉 发表于 2020-6-19 11:51
嗯,改了一下
现在的代码是




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

第一步:
https://xxx.ilovefishc.com/forum/202005/25/072650zqq1fqqmng421bqz.jpg


第二步:
https://xxx.ilovefishc.com/forum/202005/25/072647nvzjv2zemvgxet5g.jpg
页: [1]
查看完整版本: python查找.txt文件中想要的关键字的准确位置