用 Python 删除文件中的乱码

本文介绍如何使用Python通过二进制操作和自定义规则,精确地从含有乱码的文件中删除不合规字节,实现文件净化。涉及逐字节判断和多字节编码处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们用 Python 来处理有乱码的文件时,经常会遇到编码错误,有时候不得不加一个 errors = 'ignore' 参数来忽略错误,今天分享一下如何用 Python 来删除这些乱码,得到一个干净的文件。

先说下思路:用二进制方式打开文件,这样就不会出现编码问题,然后读取每一个字节,只要这个字节不在我们使用编码的范围内,就把它踢掉,然后保存剩下的字节,我们得到的就是一个干净的文件。

比如说这样 ascii 编码的文件,它含有乱码:

7c9f24b10291530ab11df4fcce2e4067.png

处理之后是这样的:

344dfdec6f7f94e38dce5267d55cd1bf.png

代码是这样写的:

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 的编码范围之内,是的就放行,不是就要删除,看看是删除一个字节,还是两个字节就要继续判断了。删除的依据就是不会造成更多乱码。

今天的分享就到这里,如果有收获请点赞哦。

### 解决 Python Matplotlib 中文字体显示乱码问题 #### 使用 `FontProperties` 设置中文字体 为了使 Matplotlib 正确显示中文字符,可以利用 `matplotlib.font_manager.FontProperties` 来指定特定的中文字体。这可以通过创建一个 FontProperties 对象并将其传递给 plot 函数来实现[^1]。 ```python from matplotlib import font_manager import matplotlib.pyplot as plt # 定义字体属性对象 my_font = font_manager.FontProperties(fname='/path/to/simhei.ttf') # 替换为实际路径 plt.text(0.5, 0.5, '你好', fontproperties=my_font) plt.show() ``` #### 查看可用字体列表 了解当前环境中有哪些字体可供选择对于解决问题至关重要。通过打印出所有已加载的 TTF 字体名称可以帮助定位合适的中文字体: ```python from matplotlib import pyplot as plt import matplotlib print([f.name for f in matplotlib.font_manager.fontManager.ttflist]) ``` 这段代码会输出系统中存在的所有 TrueType 字体的名字,从中可以选择适合的中文字体进行设置[^2]。 #### 获取 Matplotlib 配置文件路径 有时需要编辑 Matplotlib 的配置文件 (matplotlibrc),以便全局更改默认使用的字体。要找到该文件的位置,可执行如下命令获取其具体地址: ```python import matplotlib print(matplotlib.matplotlib_fname()) ``` 此操作有助于确认是否有必要修改配置文件中的字体参数以适应本地化需求[^3]。 #### 清除缓存重建字体管理器 当遇到更新后的 Matplotlib 版本不识别之前设定好的自定义字体时,尝试清除缓存并重新构建字体数据库可能是有效的解决方案之一。以下是具体的实施方式: ```python from matplotlib.font_manager import _rebuild _rebuild() # 或者删除缓存目录下的相关内容 import shutil import matplotlib shutil.rmtree(matplotlib.get_cachedir(), ignore_errors=True) ``` 这种方法适用于那些因版本升级而导致原有设置失效的情况[^4]。 #### Mac OS 下的具体处理方案 针对 macOS 用户,在上述通用方法之外还可能涉及到查找 Matplotlib 库的确切安装位置,并确保所选字体存在于用户的个人库内或系统范围内。例如海轰提到的一个典型安装路径是 `/Users/haihong/Library/Python/3.7/lib/python/site-packages`[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值