单文件编码混乱
乱码问题基本是由于原始编码和解析时编码方式不同导致,但是在第二次使用其他编码方式打开并新增了一些内容后会导致文件内容编码方式混乱
文件中使用了两种编码格式
读取文件
使用以上两种编码方式进行读取文件
# 使用`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: 上面内容是一条狗