shanhong2021 发表于 2021-6-30 14:45:17

OS课后作业查找关键字问题

# coding=gbk
import os
def key_in_line(line, key):    # 记录关键字在行的什么位置
    pos = []
    begin = line.find(key)
    while begin != -1:
      pos.append(begin + 1)
      begin = line.find(key, begin + 1)
    return pos


def search_in_file(filename, key):   # 在文件中查找有没有关键字并且把它所在行记录为一个字典
    f = open(filename, encoding='utf-8')
    key_dict = {}
    for index, each_line in enumerate(f):
      if key in each_line:
            pos = key_in_line(each_line, key)
            key_dict = pos
    f.close()
    for i in key_dict:
      for j in key_dict:
            print(f'关键字【{key}】在文件【{filename}】里的第【{i}】行第【{j}】字出现。')


def search_txt_file(path,key,dicide):   # 处理给出的路径并筛选处所有txt文件
    os.chdir(path)
    allfile = list(os.walk(os.getcwd()))
    txt_file = []
    for i in allfile:
      for j in i:
            if os.path.splitext(j) == '.txt':
                txt_file.append(os.path.join(i,j))
    for h in txt_file:
      search_in_file(h,key)
def input_():
    while True:
      path = input('请输入要查找的范围/输入路径/退出按q:')
      if path == 'q':
            break
      key = input('请输入要查找的关键字/退回上级按q:')
      if key == 'q':
            return input_()
      dicide = input('请为您是否要打印关键字的位置/确定输入yes:')
      if dicide in ['YES', 'Yes', 'yes']:
            search_txt_file(path,key,dicide)
      else:
            break

input_()

输出
请输入要查找的范围/输入路径/退出按q:E:\A
请输入要查找的关键字/退回上级按q:小甲鱼
请为您是否要打印关键字的位置/确定输入yes:yes
关键字【小甲鱼】在文件【E:\A\对话记录片段.txt】里的第【1】行第【5】字出现。
关键字【小甲鱼】在文件【E:\A\对话记录片段.txt】里的第【2】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\对话记录片段.txt】里的第【3】行第【7】字出现。
关键字【小甲鱼】在文件【E:\A\对话记录片段.txt】里的第【4】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\对话记录片段.txt】里的第【6】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\对话记录片段.txt】里的第【8】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【1】行第【5】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【2】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【4】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【6】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【8】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【10】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【13】行第【5】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【14】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【15】行第【7】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【16】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【18】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【20】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【22】行第【5】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【23】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【25】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【27】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【29】行第【1】字出现。
关键字【小甲鱼】在文件【E:\A\C\record.txt】里的第【31】行第【1】字出现。
请输入要查找的范围/输入路径/退出按q:
问题这个程序成功了。但是换一个路径就会报错。小甲鱼的答案也是一模一样的报错
小甲鱼答案报错如下
请将该脚本放于待查找的文件夹内,请输入关键字:小甲鱼
请问是否需要打印关键字【小甲鱼】在文件中的具体位置(YES/NO):yes
Traceback (most recent call last):
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_练习2.py", line 58, in <module>
    search_files(key, detail)
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_练习2.py", line 48, in search_files
    key_dict = search_in_file(each_txt_file, key)
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_练习2.py", line 27, in search_in_file
    for each_line in f:
File "C:\Users\lili2\AppData\Local\Programs\Python\Python39\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte

我写的以上程序如果换一个路径也是一模一样的报错。是不是哪里有什么设定的小机关。

jackz007 发表于 2021-6-30 14:56:57

本帖最后由 jackz007 于 2021-6-30 15:11 编辑

      你的代码是统一按 utf-8 解码每一个"*.txt" 文件的内容,假如某一个 "*.txt" 文件并非采用 utf-8 编码,而是采用了 gbk 编码,在读取文件内容的时候,你的代码就会出错。

      把这一句代码
    f = open(filename, encoding='utf-8')
      替换为下面的代码试试看
    fp = open(filename, 'rb')
    b = fp . read()
    fp . close()
    try:
      f = b . decode('utf-8')
    except:
      try:
            f = b . decode('gbk')
      except:
            print('*** [%s] : 无法解码文件' % filename)

shanhong2021 发表于 2021-6-30 17:55:09

改成上述代码还是报错
请输入要查找的范围/输入路径/退出按q:C:/Users/lili2/PycharmProjects/python学习/小甲鱼Python学习
请输入要查找的关键字/退回上级按q:小甲鱼
请为您是否要打印关键字的位置/确定输入yes:yes
Traceback (most recent call last):
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_os作业查找关键字.py", line 59, in <module>
    input_()
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_os作业查找关键字.py", line 55, in input_
    search_txt_file(path,key,decide)
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_os作业查找关键字.py", line 44, in search_txt_file
    search_in_file(h,key)
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_os作业查找关键字.py", line 25, in search_in_file
    for index, each_line in enumerate(fp):
ValueError: I/O operation on closed file.

shanhong2021 发表于 2021-7-1 09:48:12

我把当前文件夹里面的几个txt文件前面都加了个# -*- coding: UTF-8 -*-
然后小甲鱼的答案编码就变成这样的虽然也会报错但是还是出来了一些。
输出
请将该脚本放于待查找的文件夹内,请输入关键字:小甲鱼
请问是否需要打印关键字【小甲鱼】在文件中的具体位置(YES/NO):yes
================================================================
Traceback (most recent call last):
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_练习2.py", line 58, in <module>
    search_files(key, detail)
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_练习2.py", line 48, in search_files
    key_dict = search_in_file(each_txt_file, key)
File "C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\lili_练习2.py", line 27, in search_in_file
    for each_line in f:
File "C:\Users\lili2\AppData\Local\Programs\Python\Python39\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 26: invalid start byte
在文件【C:\Users\lili2\PycharmProjects\python学习\小甲鱼Python学习\record.txt】中找到关键字【小甲鱼】
关键字出现在第 2 行,第 个位置。
关键字出现在第 3 行,第 个位置。
关键字出现在第 5 行,第 个位置。
关键字出现在第 7 行,第 个位置。
关键字出现在第 9 行,第 个位置。
关键字出现在第 11 行,第 个位置。
关键字出现在第 14 行,第 个位置。
关键字出现在第 15 行,第 个位置。
关键字出现在第 16 行,第 个位置。
关键字出现在第 17 行,第 个位置。
关键字出现在第 19 行,第 个位置。
关键字出现在第 21 行,第 个位置。
关键字出现在第 23 行,第 个位置。
关键字出现在第 24 行,第 个位置。
关键字出现在第 26 行,第 个位置。
关键字出现在第 28 行,第 个位置。
关键字出现在第 30 行,第 个位置。
关键字出现在第 32 行,第 个位置。
到底出了什么问题呢

shanhong2021 发表于 2021-7-1 10:04:26

我已经自己解决问题了。哈哈。我可以设自己的答案为最佳答案吗?不知道怎么设置哦
就是在pycharm的设置里找到file encoding把当前文件夹设置为utf-8小甲鱼的答案就不会报错了。我的程序换个路径也不会报错了。
页: [1]
查看完整版本: OS课后作业查找关键字问题