paohhee 发表于 2021-3-27 16:09:38

python第30课 课后作业,第四题

本帖最后由 paohhee 于 2021-3-27 17:50 编辑

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

    key = input("请将脚本放于待查找的文件夹内,请输入关键字:")
    flag = input("请问是否需要打印关键字[%s]在文件中的具体位置(YES/NO):" % key)

    def function(key):
      os.chdir(os.curdir)

      local = os.listdir(os.curdir)
      for each in local:
            if os.path.isfile(each):
                file_name = os.getcwd() + os.sep + each
                list1 = []
                count = 0
                again = True
                f = open(file_name, "r", encoding='gbk')

                for j in f:
                  list1.append(j)
                f.close()
                for string in list1:
                  if again and string.find(key)+1:
                        print("=" * 20)
                        print("\n" + "文件[%s]中找到关键字[%s]"
                              % (file_name, key))
                        again = False

                  index = []
                  while True:
                        if string.find(key) != -1:
                            num = string.find(key)
                            index.append(num)
                            string = string[:num] + "1"*len(key) + string
                        else:
                            break
                  count += 1
                  if index:
                        print("关键字出现在%d行,第%s个位置" % (count, index))

            if os.path.isdir(each):
                function(key)
                os.chdir(os.pardir)
    if flag.upper() == "YES":
      function(key)

运行起来发现一直在报:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 223: illegal multibyte sequence
估计是for j in f:那个语句那里出的问题可是不知道错在哪里,求大神帮忙纠正一下


而且发现了只要其他另一类文件不在此文件夹中,就不会报错

抉择啊 发表于 2021-3-27 16:09:39

paohhee 发表于 2021-3-30 20:52
一样的嗷都是报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0 ...

open('文件路径',encoding='gb18030',errors='ignore')
试试{:10_282:}

Daniel_Zhang 发表于 2021-3-28 04:23:26

f = open(file_name, "r", encoding='gbk')改成

f = open(file_name, "r", encoding='utf-8')

试试看

paohhee 发表于 2021-3-28 10:10:45

Daniel_Zhang 发表于 2021-3-28 04:23
f = open(file_name, "r", encoding='gbk')改成

f = open(file_name, "r", encoding='utf-8')


试过了也还是会报错{:10_266:}

Daniel_Zhang 发表于 2021-3-28 13:21:50

paohhee 发表于 2021-3-28 10:10
试过了也还是会报错

嘶,那我没招了{:10_266:}

Daniel_Zhang 发表于 2021-3-28 13:22:40

paohhee 发表于 2021-3-28 10:10
试过了也还是会报错

要不你单独拉一个py文件,打开那个文件,看看能不能打开

paohhee 发表于 2021-3-28 21:00:04

Daniel_Zhang 发表于 2021-3-28 13:22
要不你单独拉一个py文件,打开那个文件,看看能不能打开

如果目录里面全是.py的文件就能正常打开,一旦有其他的文件就打开文件的时候编码那儿报错

Daniel_Zhang 发表于 2021-3-28 21:32:54

paohhee 发表于 2021-3-28 21:00
如果目录里面全是.py的文件就能正常打开,一旦有其他的文件就打开文件的时候编码那儿报错

那我知道了,你搞个try-except 看看

有可能是既有 gbk,又有 utf-8 的{:10_250:}

paohhee 发表于 2021-3-29 21:09:28

Daniel_Zhang 发表于 2021-3-28 21:32
那我知道了,你搞个try-except 看看

有可能是既有 gbk,又有 utf-8 的

太久没写python了啥也不会了
等我学学先

抉择啊 发表于 2021-3-30 19:56:14

# -*- coding:utf-8 -*- 头部加一个这个试试?

paohhee 发表于 2021-3-30 20:52:45

抉择啊 发表于 2021-3-30 19:56
头部加一个这个试试?

一样的嗷都是报错{:10_266:}
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

名字只有七个字 发表于 2021-3-31 13:22:53

你保存文件时用的什么编码?

jackz007 发表于 2021-3-31 14:46:48

本帖最后由 jackz007 于 2021-3-31 15:17 编辑

      楼主,试试这个代码
#coding:gbk

import os
import sys

def search(dir , key):
    try:
      for each in os . listdir(dir):
            x = os . path . join(dir , each)
            if os . path . isfile(x):
                fp = open(x , 'rb')
                b = fp . read()
                fp . close()
                e = True
                try:
                  txt = b . decode('GBK')
                except:
                  try:
                        txt = b . decode('UTF-8')
                  except:
                        sys . stderr . write('*** 无法按文本读取文件 : ' + x + '\n')
                        e = False
                if e:
                  d , i = [] , 0
                  for s in txt . split('\n'):
                        c = s . find(key , 0)
                        while c != -1:
                            d . append((i + 1 , c + 1))
                            c = s . find(key , c + len(key))
                        i += 1
                  if(d):
                        sys . stdout . write('在文件 : ' + x + ' 中找到关键字\n')
                        for k in d:
                            sys . stdout . write('\t第 %d 行,第 %d 列\n' % (k , k))
            elif os . path . isdir(x):
                search(x , key)
    except Exception as e:
      sys . stderr . write(e + '\n')
p = input('输入路径 [%s] : ' % os . getcwd()) . strip()
if not p:
    p = os . getcwd()
k = input('输入关键字 : ') . strip()
if k:
    search(p , k)
页: [1]
查看完整版本: python第30课 课后作业,第四题