鱼C论坛

 找回密码
 立即注册
查看: 2049|回复: 5

Python 30讲课后4题

[复制链接]
发表于 2021-5-12 17:38:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import os
def find_fun(path, word):
    i = 0
    count = []
    for each in os.listdir(path):
        each_path = os.path.join(path, each)
        if os.path.isfile(each_path):
            each_list = os.path.splitext(each)
            if str(each_list[1]) == '.txt':
                print('=================================================')
                print(f'在文件【{each_path}】中找到关键字【{word}】')
                fun(each_path, word)
        else:
            next_path = each_path
            find_fun(next_path, word)

def fun(each_path, word):
    i = 0
    count = []
    file = open (each_path)
    file_list = list(file)
    for each_line in file_list:
        i += 1
        index = each_line.find(word)
        if index != -1:
            count.append(index)
            for m in range(count[-1], len(each_line)):
                if index != -1:
                    index = each_line.find(word, (count[-1] + 1), len(each_line))
            print(f'关键字出现在第 {i} 行,第{count}位置')
            count.clear()

word = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
path = os.getcwd()
print (f'请问是否需要打印关键字【{word}】在文件中的具体位置(YES\\NO):', end = '')
judge = input()
if judge == 'YES' or judge == 'yes':
    find_fun(path, word)
    



运行报错编码错误,什么叫编码错误,怎么改正
路径有中文字的问题吗

还有什么其他问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 17:56:06 | 显示全部楼层
第20行
file = open(each_path, encoding='utf-8')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-12 18:06:43 | 显示全部楼层

试了 ,不行

好像是因为我的目标文件有点是utf8 编码  有的是gbk编码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-12 18:20:46 | 显示全部楼层
如果是用pycharm编写的话,可以试试到文件--设置--编辑器--文件编码,你会看左上两个和下面一个框写着gbk,把这三个改成utf-8。或者你把报错的代码发一下。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-12 18:38:28 | 显示全部楼层
import os
def find_fun(path, word):
    for each in os.listdir(path):
        each_path = os.path.join(path, each)
        if os.path.isfile(each_path):
            each_list = os.path.splitext(each)
            if str(each_list[1]) == '.txt':
                file = open (each_path)
                if word in file.read():
                    file.close()
                    print('=================================================')
                    print(f'在文件【{each_path}】中找到关键字【{word}】')
                    fun(each_path, word)
        else:
            next_path = each_path
            find_fun(next_path, word)

def fun(each_path, word):
    i = 0
    count = []
    file = open (each_path)
    file_list = list(file)
    for each_line in file_list:
        i += 1
        index = each_line.find(word)
        if index != -1:
            count.append(index)
            for m in range(count[-1], len(each_line)):
                if index != -1:
                    index = each_line.find(word, (count[-1] + 1), len(each_line))
            print(f'关键字出现在第 {i} 行,第{count}位置')
            count.clear()
    file.close()

word = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
path = os.getcwd()
print (f'请问是否需要打印关键字【{word}】在文件中的具体位置(YES\\NO):', end = '')
judge = input()
if judge == 'YES' or judge == 'yes':
    find_fun(path, word)
    

已解决了,试过gbk 和 utf8 编码方式打开,都会报错
后来在群小伙伴的提示下发现我的目标文件有点是gbk编码 有的是utf8编码
这样就导致无论用哪种方式打开总会报编码错误的BUG
最后把所有文件全部修改为gbk编码方式就可以完美运行了
如果大家发现还有BUG请在后面跟帖讨论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-12 20:51:33 | 显示全部楼层
sxhqyxc 发表于 2021-5-12 18:38
已解决了,试过gbk 和 utf8 编码方式打开,都会报错
后来在群小伙伴的提示下发现我的目标文件有点是gb ...

那你可以用chardet
import chardet
with open('test.txt', 'rb') as f:
    cd = chardet.detect(f.read())['encoding']
with open('test.txt', 'r', encoding=cd) as f:
    print(f.read())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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