鱼C论坛

 找回密码
 立即注册
查看: 1417|回复: 6

[已解决]Python:'gbk' codec can't decode byte 0x80 in position 20: illegal multibyte seq

[复制链接]
发表于 2020-11-17 20:18:03 | 显示全部楼层 |阅读模式

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

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

x
自己写程序时,使用with open() 打开文件时,出现这个错误,复制小甲鱼的示例代码运行还是出现这个问题。
import os


def print_pos(key_dict):
    keys = key_dict.keys()
    keys = sorted(keys)  # 由于字典是无序的,我们这里对行数进行排序
    for each_key in keys:
        print('关键字出现在第 %s 行,第 %s 个位置。' % (each_key, str(key_dict[each_key])))


def pos_in_line(line, key):
    pos = []
    begin = line.find(key)
    while begin != -1:
        pos.append(begin + 1)  # 用户的角度是从1开始数
        begin = line.find(key, begin + 1)  # 从下一个位置继续查找

    return pos


def search_in_file(file_name, key):
    f = open(file_name)
    count = 0  # 记录行数
    key_dict = dict()  # 字典,用户存放key所在具体行数对应具体位置

    for each_line in f:
        count += 1
        if key in each_line:
            pos = pos_in_line(each_line, key)  # key在每行对应的位置
            key_dict[count] = pos

    f.close()
    return key_dict


def search_files(key, detail):
    all_files = os.walk(os.getcwd())
    txt_files = []

    for i in all_files:
        for each_file in i[2]:
            if os.path.splitext(each_file)[1] == '.txt':  # 根据后缀判断是否文本文件
                each_file = os.path.join(i[0], each_file)
                txt_files.append(each_file)

    for each_txt_file in txt_files:
        key_dict = search_in_file(each_txt_file, key)
        if key_dict:
            print('================================================================')
            print('在文件【%s】中找到关键字【%s】' % (each_txt_file, key))
            if detail in ['YES', 'Yes', 'yes']:
                print_pos(key_dict)


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

============================================================
Traceback (most recent call last):
  File "F:/python/pythonProject/find_key.py", line 57, in <module>
    search_files(key, detail)
  File "F:/python/pythonProject/find_key.py", line 47, in search_files
    key_dict = search_in_file(each_txt_file, key)
  File "F:/python/pythonProject/find_key.py", line 26, in search_in_file
    for each_line in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 20: illegal multibyte sequence
最佳答案
2020-11-17 21:03:01
本帖最后由 hrp 于 2020-11-17 21:21 编辑
mcy2223535173 发表于 2020-11-17 20:31
大佬,修改之后运行就出现了这样的错误

Traceback (most recent call last):


那就是你的文件都不是以这两种编码保存的了,用chardet模块来猜测文件编码再打开吧,要不就用记事本打开那个报错的文件,重新以utf-8编码保存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-17 20:19:16 From FishC Mobile | 显示全部楼层
open里加个参数:encoding='utf-8'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-17 20:31:48 | 显示全部楼层
hrp 发表于 2020-11-17 20:19
open里加个参数:encoding='utf-8'

大佬,修改之后运行就出现了这样的错误

Traceback (most recent call last):
File "F:/python/pythonProject/find_key.py", line 57, in <module>
    search_files(key, detail)
  File "F:/python/pythonProject/find_key.py", line 47, in search_files
    key_dict = search_in_file(each_txt_file, key)
  File "F:/python/pythonProject/find_key.py", line 26, in search_in_file
    for each_line in f:
  File "C:\Python38\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 20:33:32 | 显示全部楼层
        这句
  1. def search_in_file(file_name, key):
  2.     f = open(file_name)  # 改这句
复制代码

        改为
  1. def search_in_file(file_name, key):
  2.     f = open(file_name , encoding = 'UTF-8')  # 改这句
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-17 20:40:09 | 显示全部楼层
jackz007 发表于 2020-11-17 20:33
这句

        改为

大佬,我修改之后运行出现了另外的错误
def search_in_file(file_name, key):
    f = open(file_name, encoding="UTF-8")

=====================================
Traceback (most recent call last):
  File "F:/python/pythonProject/find_key.py", line 57, in <module>
    search_files(key, detail)
  File "F:/python/pythonProject/find_key.py", line 47, in search_files
    key_dict = search_in_file(each_txt_file, key)
  File "F:/python/pythonProject/find_key.py", line 26, in search_in_file
    for each_line in f:
  File "C:\Python38\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 21:03:01 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrp 于 2020-11-17 21:21 编辑
mcy2223535173 发表于 2020-11-17 20:31
大佬,修改之后运行就出现了这样的错误

Traceback (most recent call last):


那就是你的文件都不是以这两种编码保存的了,用chardet模块来猜测文件编码再打开吧,要不就用记事本打开那个报错的文件,重新以utf-8编码保存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-18 09:18:38 | 显示全部楼层
hrp 发表于 2020-11-17 21:03
那就是你的文件都不是以这两种编码保存的了,用chardet模块来猜测文件编码再打开吧,要不就用记事本打 ...

谢谢大佬,有文件无法用这两种编码打开,我使用其他的文件就可以打开了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 12:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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