ilovedota2 发表于 2020-11-30 14:26:24

python课后作业第30讲:文件系统

import os
import os.path

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)
      begin = line.find(key,begin + 1)
    return pos


def search_in_file(file_name,key):
    f = open(file_name,encoding='UTF-8')
    count = 0
    key_dict = dict()

    for each_line in f:
      count += 1
      if key in each_line:
            pos = pos_in_line(each_line,key)
            key_dict = pos
            
    f.close()
    return key_dict


def search_file(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('========================\n')
            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_file(key,detail)


求助论坛的朋友们,为什么我这段代码会出现以下的错误?

======= RESTART: C:/Users/xunqing zhang/Desktop/练习/练习28课后题/练习28课后题4答案.py =======
请输入要查找的关键字:小甲鱼
请问是否需要打印关键字【小甲鱼】在文件中的具体位置(YES/NO):yes
========================

在文件【C:\Users\xunqing zhang\Desktop\练习\练习28课后题\test.txt】中找到关键字【小甲鱼】
关键字出现在第4行,第个位置
关键字出现在第5行,第个位置
关键字出现在第8行,第个位置
Traceback (most recent call last):
File "C:/Users/xunqing zhang/Desktop/练习/练习28课后题/练习28课后题4答案.py", line 57, in <module>
    search_file(key,detail)
File "C:/Users/xunqing zhang/Desktop/练习/练习28课后题/练习28课后题4答案.py", line 47, in search_file
    key_dict = search_in_file(each_txt_file,key)
File "C:/Users/xunqing zhang/Desktop/练习/练习28课后题/练习28课后题4答案.py", line 26, in search_in_file
    for each_line in f:
File "C:\Users\xunqing zhang\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 0xc1 in position 31: invalid start byte


谢谢大家

西瓜味的苹果 发表于 2020-11-30 14:46:43

确定你的所有文件都是以utf8编码格式保存的吗

sunrise085 发表于 2020-11-30 15:08:37

本帖最后由 sunrise085 于 2020-11-30 15:44 编辑

没有其他问题,就是你所打开的文件编码不正确,部分内容不是utf8编码。
你把你这个txt文件打开,另存一下,存储的时候修改一下编码就可以了

ilovedota2 发表于 2020-11-30 15:20:28

sunrise085 发表于 2020-11-30 15:08
没有其他问题,就是你锁打开的文件编码不正确,部分内容不是utf8编码。
你把你这个txt文件打开,另存一下 ...

谢谢您,确实有一个不是UTF-8编码

ilovedota2 发表于 2020-11-30 15:22:29

西瓜味的苹果 发表于 2020-11-30 14:46
确定你的所有文件都是以utf8编码格式保存的吗

谢谢您,确实有一个不是UTF-8编码~

西瓜味的苹果 发表于 2020-11-30 15:34:50

ilovedota2 发表于 2020-11-30 15:22
谢谢您,确实有一个不是UTF-8编码~

有一个小小的细节纠正你一下,并不是utf8无敌,而是其他gbk,gb2312什么的都可以编码,解码。需要记住的是只要时时刻刻保持你的文件以什么编码保存的,那么就用什么编码读取就行!!主要是python默认是utf8,并且utf8很好用,所以很多回答都是utf8
备注:(我回答的这么棒,然而不给我好评,{:5_90:})哈哈,开玩笑的。

ilovedota2 发表于 2020-11-30 16:06:54

西瓜味的苹果 发表于 2020-11-30 15:34
有一个小小的细节纠正你一下,并不是utf8无敌,而是其他gbk,gb2312什么的都可以编码,解码。需要记住的是 ...

好的,谢谢您哈~
页: [1]
查看完整版本: python课后作业第30讲:文件系统