鱼C论坛

 找回密码
 立即注册
查看: 1768|回复: 26

[已解决]新手/遇到了一个看不懂的异常

[复制链接]
发表于 2020-7-27 22:21:41 | 显示全部楼层 |阅读模式

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

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

x
Traceback (most recent call last):
  File "D:/python学习专栏/文本关键字查找.py", line 10, in <module>
    for each_line in file1:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xc0 in position 16: illegal multibyte sequence
本题是Python30课的作业4,原程序如下:
import os
initial=input('请输入待查找的目录:')
key=input('请输入关键字:')
for(root,dirs,file)in os.walk(initial):
    for each in file:
        count_line=0
        y=1
        z=0
        if os.path.splitext(each)[1]=='.txt':
            file1=open(os.path.join(root,each))
            for each_line in file1:
                count_line+=1
                count_index=[]
                x=0
                for i in range(len(each_line)):
                    if each_line[i:i+len(key)]==key:
                        count_index.append(i)
                        x=z=1
                if x:
                    if y:
                        print('在文件【{0}】中找到关键字【{1}】'.format(os.path.join(root,each),key))
                        y=0
                    print('关键字出现在第{0}行,第{1}个位置。'.format(count_line,count_index))
            if z:
                print('=================================================')
想请教一下错误原因,及如何解决~
最佳答案
2020-7-28 11:29:48
天下稽首 发表于 2020-7-28 10:18
没关系,无论如何都非常感谢啦~




把你的目录下文本另存为改下编码就好,建议新建个文件夹,把代码和 txt 都重新保存那个文件夹里,然后 txt 通过下面方法保存:

                               
登录/注册后可看大图

这里选择 UTF-8 那么 open 就要带上参数 encoding = 'UTF-8':

                               
登录/注册后可看大图

这里如果选择 ANSI 就不用带上参数 encoding :

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-27 22:24:50 | 显示全部楼层
编码问题
改成
import os
initial=input('请输入待查找的目录:')
key=input('请输入关键字:')
for(root,dirs,file)in os.walk(initial):
    for each in file:
        count_line=0
        y=1
        z=0
        if os.path.splitext(each)[1]=='.txt':
            file1=open(os.path.join(root,each),encoding='utf-8')
            for each_line in file1:
                count_line+=1
                count_index=[]
                x=0
                for i in range(len(each_line)):
                    if each_line[i:i+len(key)]==key:
                        count_index.append(i)
                        x=z=1
                if x:
                    if y:
                        print('在文件【{0}】中找到关键字【{1}】'.format(os.path.join(root,each),key))
                        y=0
                    print('关键字出现在第{0}行,第{1}个位置。'.format(count_line,count_index))
            if z:
                print('=================================================')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 22:33:01 | 显示全部楼层
编码问题,这样应该可以了:
import os
initial=input('请输入待查找的目录:')
key=input('请输入关键字:')
for(root,dirs,file)in os.walk(initial):
    for each in file:
        count_line=0
        y=1
        z=0
        if os.path.splitext(each)[1]=='.txt':
            try:
                file1=open(os.path.join(root,each))
            except Exception:
                file1 = open(os.path.join(root, each), encoding='utf-8')
            for each_line in file1:
                count_line+=1
                count_index=[]
                x=0
                for i in range(len(each_line)):
                    if each_line[i:i+len(key)]==key:
                        count_index.append(i)
                        x=z=1
                if x:
                    if y:
                        print('在文件【{0}】中找到关键字【{1}】'.format(os.path.join(root,each),key))
                        y=0
                    print('关键字出现在第{0}行,第{1}个位置。'.format(count_line,count_index))
            if z:
                print('=================================================')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 08:29:04 | 显示全部楼层
zltzlt 发表于 2020-7-27 22:33
编码问题,这样应该可以了:

但是还是报错呀……和原来一样的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 08:31:02 | 显示全部楼层

我之前就尝试过这么改了……但是还是报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb in position 2: invalid start byte
(不过错误好像不一样了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 08:36:15 | 显示全部楼层
天下稽首 发表于 2020-7-28 08:31
我之前就尝试过这么改了……但是还是报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb i ...

试试用二进制读取,然后再把它decode成utf-8,
类似于这样

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 08:50:23 | 显示全部楼层
天下稽首 发表于 2020-7-28 08:31
我之前就尝试过这么改了……但是还是报错
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb i ...

使用 rb 打开试试?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 08:56:14 | 显示全部楼层
liuzhengyuan 发表于 2020-7-28 08:50
使用 rb 打开试试?

错的……好像更离谱了?
Traceback (most recent call last):
  File "D:/python学习专栏/文本关键字查找(网络测试版2).py", line 10, in <module>
    file1=open(os.path.join(root,each),'rb',encoding='utf-8')
ValueError: binary mode doesn't take an encoding argument
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 08:59:54 | 显示全部楼层
天下稽首 发表于 2020-7-28 08:56
错的……好像更离谱了?
Traceback (most recent call last):
  File "D:/python学习专栏/文本关键字查 ...

把 encoding 去掉试试?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 09:07:08 | 显示全部楼层
1q23w31 发表于 2020-7-28 08:36
试试用二进制读取,然后再把它decode成utf-8,
类似于这样

不会decode函数哎……而且你刚刚那个附件一直加载不出来/捂脸
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 09:08:48 | 显示全部楼层
本帖最后由 1q23w31 于 2020-7-28 09:16 编辑
天下稽首 发表于 2020-7-28 09:07
不会decode函数哎……而且你刚刚那个附件一直加载不出来/捂脸


图片出不来吗?
import os
initial=input('请输入待查找的目录:')
key=input('请输入关键字:')
for(root,dirs,file)in os.walk(initial):
    for each in file:
        count_line=0
        y=1
        z=0
        if os.path.splitext(each)[1]=='.txt':
            try:
                file1=open(os.path.join(root,each))
            except Exception:
                file1 = open(os.path.join(root, each), 'rb')
                lines = file1.read().decode('utf-8')
            for each_line in lines:
                count_line+=1
                count_index=[]
                x=0
                for i in range(len(each_line)):
                    if each_line[i:i+len(key)]==key:
                        count_index.append(i)
                        x=z=1
                if x:
                    if y:
                        print('在文件【{0}】中找到关键字【{1}】'.format(os.path.join(root,each),key))
                        y=0
                    print('关键字出现在第{0}行,第{1}个位置。'.format(count_line,count_index))
            if z:
                print('=================================================')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 09:10:41 | 显示全部楼层
1q23w31 发表于 2020-7-28 09:08
图片出不来吗?

嗯,加载不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 09:12:27 | 显示全部楼层

发到上面了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 09:12:42 | 显示全部楼层
liuzhengyuan 发表于 2020-7-28 08:59
把 encoding 去掉试试?

去掉之后程序都跑不起来/捂脸
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 09:21:21 | 显示全部楼层
1q23w31 发表于 2020-7-28 09:08
图片出不来吗?

首先,在try那个位置没有定义lines
然后我这样改了一下,
try:
                file1=open(os.path.join(root,each))
                lines=file1.read()
然后……错误就更多了……
Traceback (most recent call last):
  File "D:/python学习专栏/文本关键字查找(网络测试版3).py", line 12, in <module>
    lines=file1.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xc0 in position 16: illegal multibyte sequence

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/python学习专栏/文本关键字查找(网络测试版3).py", line 15, in <module>
    lines = file1.read().decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 16: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 09:25:54 | 显示全部楼层
本帖最后由 1q23w31 于 2020-7-28 09:29 编辑
天下稽首 发表于 2020-7-28 09:21
首先,在try那个位置没有定义lines
然后我这样改了一下,
try:


指定模式打开试试
import os
initial=input('请输入待查找的目录:')
key=input('请输入关键字:')
for(root,dirs,file)in os.walk(initial):
    for each in file:
        count_line=0
        y=1
        z=0
        if os.path.splitext(each)[1]=='.txt':
            file1=open(os.path.join(root,each),'r',encoding='utf-8')
            for each_line in file1:
                count_line+=1
                count_index=[]
                x=0
                for i in range(len(each_line)):
                    if each_line[i:i+len(key)]==key:
                        count_index.append(i)
                        x=z=1
                if x:
                    if y:
                        print('在文件【{0}】中找到关键字【{1}】'.format(os.path.join(root,each),key))
                        y=0
                    print('关键字出现在第{0}行,第{1}个位置。'.format(count_line,count_index))
            if z:
                print('=================================================')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 09:27:54 | 显示全部楼层
1q23w31 发表于 2020-7-28 09:25
指定模式打开试试

依然是这个错误
Traceback (most recent call last):
  File "D:/python学习专栏/文本关键字查找(网络测试版4).py", line 11, in <module>
    for each_line in file1:
  File "D:\Python软件\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb in position 2: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 09:34:25 | 显示全部楼层
天下稽首 发表于 2020-7-28 09:27
依然是这个错误
Traceback (most recent call last):
  File "D:/python学习专栏/文本关键字查找(网络 ...

你这是什么文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 09:37:11 | 显示全部楼层
天下稽首 发表于 2020-7-28 09:21
首先,在try那个位置没有定义lines
然后我这样改了一下,
try:

你没指定二进制打开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 09:41:07 | 显示全部楼层
1q23w31 发表于 2020-7-28 09:34
你这是什么文件

你是指?报错的那个吗?我也不是很清楚啊,看错误提示能找出来吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 17:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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