Python处理编码混乱的文件

Python处理编码混乱的单个文件

单文件编码混乱

乱码问题基本是由于原始编码和解析时编码方式不同导致,但是在第二次使用其他编码方式打开并新增了一些内容后会导致文件内容编码方式混乱

pSDAP0A.png
pSDAy9K.png

文件中使用了两种编码格式

读取文件

使用以上两种编码方式进行读取文件

# 使用`utf-8`读取文件
try:
    with open("C:/Users/dell/Desktop/222333.txt", "r", encoding="utf-8")as f:
        res = f.read()
    f.close()
    print("由utf-8编码读取成功,输出:", res)
except Exception as e:
    print("由utf-8编码读取失败:", e)
# 使用`GBK`读取文件
try:
    with open("C:/Users/dell/Desktop/222333.txt", "r", encoding="gbk")as f:
        res = f.read()
    f.close()
    print("由gbk编码读取成功,输出:", res)
except Exception as e:
    print("由gbk编码读取失败:", e)
# 使用`iso-8859-1`读取文件
try:
    with open("C:/Users/dell/Desktop/222333.txt", "r", encoding="iso-8859-1")as f:
        res = f.read()
    f.close()
    print("由iso-8859-1编码读取成功,输出:", res)
except Exception as e:
    print("由iso-8859-1编码读取失败:", e)

执行:

由utf-8编码读取失败: ‘utf-8’ codec can’t decode byte 0xcc in position 2: invalid continuation byte

由gbk编码读取失败: ‘gbk’ codec can’t decode byte 0xae in position 18: illegal multibyte sequence

由iso-8859-1编码读取成功,输出: Ò»Ìõ¹·
上面å†
容是一条狗

使用两种格式进行读取都不行,使用iso-8859-1可以读取但是读取出来的数据看起来更乱

解决

手动编码

with open("C:/Users/dell/Desktop/222333.txt", "r", encoding="iso-8859-1")as f:
    res = f.readlines()
f.close()
print(str(res[0]).encode("iso-8859-1").decode("gbk"))
print(str(res[1]).encode("iso-8859-1").decode("utf-8"))

执行:

第1行输出: 一条狗

第2行输出: 上面内容是一条狗

chardet库

chardet.detect()
detect()函数接受一个参数,一个非unicode字符串。它返回一个字典,其中包含自动检测到的字符编码和从0到1的可信度级别。

import chardet

with open("C:/Users/dell/Desktop/222333.txt", "r", encoding="iso-8859-1")as f:
    res = f.readlines()
f.close()
a = chardet.detect(res[0].encode("iso-8859-1"))
b = chardet.detect(res[1].encode("iso-8859-1"))
print(a)
print(b)

执行:

{‘encoding’: ‘TIS-620’, ‘confidence’: 0.2998510100301362, ‘language’: ‘Thai’}
{‘encoding’: ‘utf-8’, ‘confidence’: 0.99, ‘language’: ‘’}

第一行显然不是想要的编码方式,经观察第一行可信度不高,接下来写一个方法解决这个问题,

import chardet

# 可将try except块中的`utf-8`、`gbk`等替换为本地常用编码,可根据情况添加try except块
def chartype(data):
    ss = str(data).encode("iso-8859-1")
    # 如果可信度低于0.5使用自预测编码格式
    if float(chardet.detect(ss)['confidence']) < 0.5:
        try:
            return ss.decode("utf-8")
        except UnicodeDecodeError:
            try:
                return ss.decode("gbk")
            except UnicodeDecodeError:
                return ss.decode("ANSI")
            finally:
                return None
    else:
        return ss.decode(chardet.detect(ss)['encoding'])

with open("C:/Users/dell/Desktop/222333.txt", "r", encoding="iso-8859-1")as f:
    res = f.readlines()
f.close()
a = chartype(res[0])
b = chartype(res[1])
print('a:',a)
print('b:',b)

执行:

a: 一条狗
b: 上面内容是一条狗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值