鱼C论坛

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

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

[复制链接]
发表于 2021-3-27 16:09:38 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 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[num+len(key):]
                        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:那个语句那里出的问题可是不知道错在哪里,求大神帮忙纠正一下
微信截图_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 ...
open('文件路径',encoding='gb18030',errors='ignore')
试试

最佳答案

想知道小甲鱼最近在做啥?请访问 -> 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 ...
open('文件路径',encoding='gb18030',errors='ignore')
试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

试试看
想知道小甲鱼最近在做啥?请访问 -> 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')

试过了也还是会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

嘶,那我没招了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

要不你单独拉一个py文件,打开那个文件,看看能不能打开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

如果目录里面全是.py的文件就能正常打开,一旦有其他的文件就打开文件的时候编码那儿报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

有可能是既有 gbk,又有 utf-8 的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

太久没写python了啥也不会了
等我学学先
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-30 19:56:14 | 显示全部楼层
# -*- coding:utf-8 -*-
头部加一个这个试试?
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-31 13:22:53 | 显示全部楼层
你保存文件时用的什么编码?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[0] , k[1]))
            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荣誉 +5 鱼币 +5 贡献 +3 收起 理由
paohhee + 5 + 5 + 3 这个也是牛逼!!!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-9 16:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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