鱼C论坛

 找回密码
 立即注册
查看: 3927|回复: 12

[已解决]python第30课 课后作业,第四题

[复制链接]
发表于 2021-3-27 16:09:38 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 paohhee 于 2021-3-27 17:50 编辑
  1. def find_key():
  2.     '''编写一个程序,用户输入关键字,查找当前文件夹内
  3.     (如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的
  4.     文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置
  5.     (第几行第几个字符)'''
  6.     import os

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

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

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

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

  28.                     index = []
  29.                     while True:
  30.                         if string.find(key) != -1:
  31.                             num = string.find(key)
  32.                             index.append(num)
  33.                             string = string[:num] + "1"*len(key) + string[num+len(key):]
  34.                         else:
  35.                             break
  36.                     count += 1
  37.                     if index:
  38.                         print("关键字出现在%d行,第%s个位置" % (count, index))

  39.             if os.path.isdir(each):
  40.                 function(key)
  41.                 os.chdir(os.pardir)
  42.     if flag.upper() == "YES":
  43.         function(key)
复制代码


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

而且发现了只要其他另一类文件不在此文件夹中,就不会报错
微信截图_20210327163301.png
222.png
最佳答案
2021-3-27 16:09:39
paohhee 发表于 2021-3-30 20:52
一样的嗷都是报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0 ...
  1. open('文件路径',encoding='gb18030',errors='ignore')
复制代码

试试

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-27 16:09:39 | 显示全部楼层    本楼为最佳答案   
paohhee 发表于 2021-3-30 20:52
一样的嗷都是报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0 ...
  1. open('文件路径',encoding='gb18030',errors='ignore')
复制代码

试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-28 04:23:26 | 显示全部楼层
f = open(file_name, "r", encoding='gbk')改成

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

试试看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-28 10:10:45 From FishC Mobile | 显示全部楼层
Daniel_Zhang 发表于 2021-3-28 04:23
f = open(file_name, "r", encoding='gbk')改成

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

试过了也还是会报错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-28 13:21:50 | 显示全部楼层
paohhee 发表于 2021-3-28 10:10
试过了也还是会报错

嘶,那我没招了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-28 13:22:40 | 显示全部楼层
paohhee 发表于 2021-3-28 10:10
试过了也还是会报错

要不你单独拉一个py文件,打开那个文件,看看能不能打开
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-28 21:00:04 | 显示全部楼层
Daniel_Zhang 发表于 2021-3-28 13:22
要不你单独拉一个py文件,打开那个文件,看看能不能打开

如果目录里面全是.py的文件就能正常打开,一旦有其他的文件就打开文件的时候编码那儿报错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

有可能是既有 gbk,又有 utf-8 的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-29 21:09:28 | 显示全部楼层
Daniel_Zhang 发表于 2021-3-28 21:32
那我知道了,你搞个try-except 看看

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

太久没写python了啥也不会了
等我学学先
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-30 19:56:14 | 显示全部楼层
  1. # -*- coding:utf-8 -*-
复制代码
头部加一个这个试试?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-30 20:52:45 | 显示全部楼层
抉择啊 发表于 2021-3-30 19:56
头部加一个这个试试?

一样的嗷都是报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-31 13:22:53 | 显示全部楼层
你保存文件时用的什么编码?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-31 14:46:48 | 显示全部楼层
本帖最后由 jackz007 于 2021-3-31 15:17 编辑

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

  2. import os
  3. import sys

  4. def search(dir , key):
  5.     try:
  6.         for each in os . listdir(dir):
  7.             x = os . path . join(dir , each)
  8.             if os . path . isfile(x):
  9.                 fp = open(x , 'rb')
  10.                 b = fp . read()
  11.                 fp . close()
  12.                 e = True
  13.                 try:
  14.                     txt = b . decode('GBK')
  15.                 except:
  16.                     try:
  17.                         txt = b . decode('UTF-8')
  18.                     except:
  19.                         sys . stderr . write('*** 无法按文本读取文件 : ' + x + '\n')
  20.                         e = False
  21.                 if e:
  22.                     d , i = [] , 0
  23.                     for s in txt . split('\n'):
  24.                         c = s . find(key , 0)
  25.                         while c != -1:
  26.                             d . append((i + 1 , c + 1))
  27.                             c = s . find(key , c + len(key))
  28.                         i += 1
  29.                     if(d):
  30.                         sys . stdout . write('在文件 : ' + x + ' 中找到关键字\n')
  31.                         for k in d:
  32.                             sys . stdout . write('\t第 %d 行,第 %d 列\n' % (k[0] , k[1]))
  33.             elif os . path . isdir(x):
  34.                 search(x , key)
  35.     except Exception as e:
  36.         sys . stderr . write(e + '\n')
  37. p = input('输入路径 [%s] : ' % os . getcwd()) . strip()
  38. if not p:
  39.     p = os . getcwd()
  40. k = input('输入关键字 : ') . strip()
  41. if k:
  42.     search(p , k)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
paohhee + 5 + 5 + 3 这个也是牛逼!!!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 09:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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