真正解决Windows下UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0错误的方法

真正解决Windows下UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0错误的方法问题现象:在Windows下使用Python读文件时,经常遇到UnicodeDecodeError:’gbk’codeccan’tdecodebyte0xffinposition0:illegalmultibytesequence错误。在open函数参数中设置encoding=’utf-8’也不能解决问题,会出现UnicodeDecodeError:’utf-8’codeccan’tdecodebyte0xffinposition0:invalidsta

大家好,又见面了,我是你们的朋友全栈君。

问题现象:

在Windows下使用Python读文件时,经常遇到UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xff in position 0: illegal multibyte sequence错误。

在open函数参数中设置encoding=’utf-8’也不能解决问题,会出现UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte类似错误。

问题原因:

该问题的根源在于Windows中与Unicode的编码方法。

以系统自带的记事本为例:
记事本“另存为”中有4种编码方式,含义为:

  • ANSI: 对英文系统即ASCII 对中文系统即gbk/big5
  • Unicode: UTF-16(LE)
  • Unicode big endian: UTF-16(BE)
  • UTF-8:UTF-8-SIG

其中Unicode相关编码方式有3种,这3种编码方式的区别不再赘述,我们可以从文件的头部(即Windows中的特色!BOM:byte order mark)来区分一个文件是属于哪种编码。当头部开始的两个字节为 FF FE时,是UTF-16(LE)编码;当头部的两个字节为FEFF时,是UTF-16(BE)编码;当头部两个字节为EF BB时,是UTF-8-sig编码

因此,错误信息中0xff说明文件的编码为UTF-16!因此,设置UTF-8编码根本不解决问题。

解决方法:

在open函数encoding参数中设置正确的文件编码。

推荐使用chardet模块,检测文件编码方式。chardet非标准库模块,需要安装:pip install chardet

示例代码:

# coding=utf-8
def check_charset(file_path):
    import chardet
    with open(file_path, "rb") as f:
        data = f.read(4)
        charset = chardet.detect(data)['encoding']
    return charset

your_path = 你的文件路径
with open(your_path, encoding=check_charset(your_path)) as f:
    data = f.read()
    print(data)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149493.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【java实现网址转换为二维码】「建议收藏」

    【java实现网址转换为二维码】「建议收藏」我们可以实现图片二维码转换为网址,或者将网址转换为伪二维码(与普通二维码有区别,因为没有定位点,转换成的二维码只包含信息)。

    2022年9月3日
    3
  • vs 内存泄露 检测(android怎么检测内存泄露)

    BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误。              BoundsChecker能检测的错误包括:      1)指针操作和内存、资源泄露错误,比如:内存泄露;资源泄露;对指针变量的错误操作。    2)内存操作方面的错误,比如:内存读、写溢出;使用未初始化的内存。         3)API函

    2022年4月10日
    31
  • 数组 函数_从零开始的基础篇

    数组 函数_从零开始的基础篇一、数组操作的基本函数数组的键名和值array_values($arr);获得数组的值array_keys($arr);获得数组的键名array_flip($arr);数组中的值与键名互换(如

    2022年8月5日
    7
  • adb shell getenforce/setenforce(三级命令)

    adb shell getenforce/setenforce(三级命令)adbshellgetenforceadbshellsetenforce

    2022年6月27日
    34
  • WPF日期时间控件

    WPF日期时间控件最近一个WPF项目需要用到日期时间控制,因为WPF自带的控件只有日期没办法选择时间,所以后面用到了一个DateTimePicker控件,支持日期和时间的选择,但使用过程发现有一些小bug,所以进行修正。控制的效果如下:…

    2022年5月13日
    34
  • 职称计算机考试选什么模块,职称计算机考试如何选择模块?

    职称计算机考试选什么模块,职称计算机考试如何选择模块?原标题:职称计算机考试如何选择模块?众所周知,自从2013年开始,已有所增加,模块数理由原来的22个模块增加到26个考试科目。所以,考生可根据自身基础、平时接触多的或兴趣选择报考科目,按规定参加职称计算机考试的人员必须通过规定的模块数量,因各地区政策不同考生具体可登陆当地人事咨询网次查看,为了让考生更好选择职称计算机考试模块。职称计算机考试中心为考生提供如下参考:一、选择模块的原则:首先,根据考生…

    2022年6月2日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号