Python报UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position的解决办法

本文介绍在Python中使用open方法读取文本文件时遇到UnicodeDecodeError的常见原因及解决办法,特别是在Windows平台上默认编码为gbk时,如何正确指定utf-8编码避免错误。

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

with open("input.txt") as f:
    for line in f:
        print(line)

按行读取文本文件时报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position...

python的open方法默认编码取决于平台,如果是windows平台,默认编码是gbk,如果文件是utf8编码,就会报这个错误。

解决办法:

with open("input.txt",encoding='utf-8') as f:
    for line in f:
        print(line)

 

### Python 中解决 `UnicodeDecodeError` 错误的方法 当在 Python 中处理文件或数据流时,如果指定的编码方式与实际文件中的编码不符,则可能会引发 `UnicodeDecodeError` 错误。以下是针对此问题的具体解决方案: #### 1. 明确文件的实际编码 在读取文件之前,应先确认文件的真实编码格式。可以借助工具库如 `chardet` 或 `charset-normalizer` 来检测文件编码。 ```python import chardet with open('文件名', 'rb') as f: raw_data = f.read() result = chardet.detect(raw_data) encoding = result['encoding'] print(f"Detected Encoding: {encoding}") ``` 上述代码能够帮助识别文件的实际编码[^1]。 #### 2. 使用正确的编码参数 一旦明确了文件的编码类型,在读取文件时需提供相应的编码参数。例如,假设检测到文件为 GBK 编码,则可按以下方式进行操作: ```python file_data = open('文件名', mode='r', encoding="GBK").read() ``` 对于 CSV 文件的情况,同样适用相同的逻辑。如果发现 UTF-8 并不适配当前文件的内容,应该尝试其他可能的编码形式,比如 GBK: ```python import pandas as pd try: file_content = pd.read_csv("文件名", encoding='utf-8') except UnicodeDecodeError: file_content = pd.read_csv("文件名", encoding='GB2312') # 尝试使用另一种常见中文编码 print(file_content) ``` 这里提供了两种不同的编码选项来应对潜在的不同情况[^3]。 #### 3. 添加错误忽略机制 (仅作临时措施) 虽然推荐始终采用合适的编码设置解决问题根源所在,但在某些情况下也可以选择忽略非法字符作为快速修复手段之一。这可以通过向函数调用加入额外参数实现——即允许跳过那些无法解析的部分而不中断程序运行流程: ```python file_data = open('文件名', mode='r', errors='ignore').read() ``` 或者更精确地定义如何对待这些异常字符: ```python file_data = open('文件名', mode='r', encoding="utf-8", errors='replace').read() ``` 其中,“errors=‘replace’”表示将以替代符(通常是问号 ?)替换掉所有不可解码的字节序列;而“errors=‘ignore’”则完全丢弃它们[^4]。 #### 4. 调整 PyMySQL 安装配置以规避类似问题 如果是数据库连接过程中遇到了类似的编解码难题,那么调整 PyMySQL 的初始化参数可能是必要的步骤之一。确保客户端和服务端之间达成一致性的字符集协商非常重要: ```python conn = pymysql.connect(host='localhost', user='root', password='', db='testdb', charset='utf8mb4') # 设置统一支持广泛字符集合的UTF-8变体版本(utf8mb4) cursor = conn.cursor() ``` 以上示例中指定了 MySQL 数据库交互过程所使用的字符集为 utf8mb4 ,它能更好地兼容多语言环境下的各种特殊符号和表情等内容[^2]。 综上所述,面对因编码差异引起的 `UnicodeDecodeError` 类型错误时,关键是找到并应用适合目标文档/资源本身的恰当编码设定,并合理运用Python内置功能妥善处置可能出现的各种意外状况。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值