用 Python 删除文件中的乱码
Python客栈
共 760字,需浏览 2分钟
· 2022-04-07
当我们用 Python 来处理有乱码的文件时,经常会遇到编码错误,有时候不得不加一个 errors = 'ignore'
参数来忽略错误,今天分享一下如何用 Python 来删除这些乱码,得到一个干净的文件。
先说下思路:用二进制方式打开文件,这样就不会出现编码问题,然后读取每一个字节,只要这个字节不在我们使用编码的范围内,就把它踢掉,然后保存剩下的字节,我们得到的就是一个干净的文件。
比如说这样 ascii 编码的文件,它含有乱码:
![](https://filescdn.proginn.com/3b9b3169266e73fc33107b36d897625e/f30692ed7411f000eaca0c91bd05378b.webp)
处理之后是这样的:
![](https://filescdn.proginn.com/9621aaf23e0913402ab1f7ef24f40936/c0dbfb0adc7b733ec9b84d630fbcec8a.webp)
代码是这样写的:
import struct
def is_good_byte(b):
"""
可以自定义什么是好字节,比如 GBK 的字节范围可以在这里定义好
"""
return b <= 127
def clean_bytes(bs):
return filter(is_good_byte, bs)
def clean_file_bin():
with open("names.txt", mode = "rb") as reader:
with open("cleaned_names.txt", mode = "wb") as writer:
for line in reader:
for byte in clean_bytes(line):
writer.write(struct.pack('B',byte))
if __name__ == '__main__':
clean_file_bin()
上面这段代码是一个字节一个字节来处理的,如果是多字节编码,可以自行修改代码逻辑,比如一次读取 3 个字节,判断这三个字节是否一个合法的字节组合。
对于中英文混合的,比如:
>>> x
'abc中国'
>>> x.encode("GBK")
b'abc\xd6\xd0\xb9\xfa'
>>> for i in x.encode("GBK"):
... print(i)
...
97
98
99
214
208
185
250
>>>
需要综合判断,先判断是否英文字母,是的就放行,然后看接下来的两个字节是否在 GBK 的编码范围之内,是的就放行,不是就要删除,看看是删除一个字节,还是两个字节就要继续判断了。删除的依据就是不会造成更多乱码。
今天的分享就到这里,如果有收获请点赞哦。
![](https://filescdn.proginn.com/8cd9e7e0935fad88ae09f6c87d31e9be/53d3b0f2b7b16f01539595b5091c2d6d.webp)
![](https://filescdn.proginn.com/8cd9e7e0935fad88ae09f6c87d31e9be/53d3b0f2b7b16f01539595b5091c2d6d.webp)
![](https://filescdn.proginn.com/8cd9e7e0935fad88ae09f6c87d31e9be/53d3b0f2b7b16f01539595b5091c2d6d.webp)
![](https://filescdn.proginn.com/39526f08fd4d77a6653e4a62d8bb27df/227d4b1e30f3c6876826792727f3cd30.webp)
评论
广州黄金港湾幼儿园
广州市黄金港湾幼儿园是由黄金教育科技集团主办的一所集寄宿制、全日制于一体的综合性幼儿园。本园承担黄金教育科技集团的多项课题研究,全面实施黄金早期教育工程,充分发挥高校办园、科技含量高、专家力量充足的优
广州黄金港湾幼儿园
0
广州城西实验幼儿园
城西实验幼儿园创办于1998年,位于金沙街横沙社区内。多年来,该幼儿园在各级领导的关怀和指导下,认真贯彻幼儿园工作规程和幼儿园教育指导纲要,坚持正确的办园思想,结合形势发展需要,加大对教育改革的力度,
广州城西实验幼儿园
0
广州阳阳实验幼儿园
广州市番禺区阳阳实验幼儿园是一所广州市一级民办幼儿园。创办于1998年9月,全园建筑面积7000多平方米,占地6000多平方米,园内设施齐全,除17间标准活动室外,设有儿童寝室7大间、教工卫生间9个、
广州阳阳实验幼儿园
0
广州沙面实验幼儿园
我园总建筑面积为约2588平方米,户外面积约858平方米,是荔湾区内小学改建的幼儿园当中硬件较好的幼儿园。南北两座教学楼座落于宽阔的操场两侧、安全的大型户外玩具让孩子们尽情享受户外活动的乐趣。独立的室
广州沙面实验幼儿园
0
广州童星实验幼儿园
广州市番禺区沙湾黄金童星实验幼儿园是番禺区一级幼儿园、广州市绿色幼儿园。2011年8月改由黄金教育科技集团经营管理,是全国教育科学“十五”规划课题《0-6岁婴幼儿机能发展研究》、《规范性语言领先的双语
广州童星实验幼儿园
0