Python/pandas如何正确读取含西里尔字符的cp1251编码CSV文件
问题解决办法
核心原因
你直接给pd.read_csv()传入远程URL时,pandas会先通过自带的HTTP请求工具拉取内容,这一步会自动对字节流做编码识别,你后续传入的encoding参数不会作用在拉取阶段的解码逻辑,因此即使指定了正确编码,拉取阶段已经把西里尔字符解码为乱码,后续无法恢复。
可行方案
方案1:读取本地已下载的文件
本地文件不存在远程拉取的编码识别问题,直接指定编码读取即可:
import pandas as pd # 替换为你本地的文件实际存储路径 local_file = r'C:\Users\dryingmouth\data\bills\plenary_agenda-skl9.csv' bills = pd.read_csv(local_file, encoding='cp1251') bills.head()
方案2:直接读取远程链接无需下载
先用requests库获取文件的原始字节内容,手动指定编码解码后再传入pandas,避免自动识别编码出错:
import pandas as pd import requests from io import StringIO url = 'https://data.rada.gov.ua/ogd/zal/ppz/skl9/plenary_agenda-skl9.csv' # 获取文件原始字节 resp = requests.get(url) # 手动指定编码解码为文本 file_text = resp.content.decode('cp1251') # 读入DataFrame bills = pd.read_csv(StringIO(file_text)) bills.head()
异常排查
如果上述操作后仍显示乱码,可按以下步骤逐一排查:
- 替换编码参数测试:乌克兰语常用编码还有
koi8-u、utf-8、utf-8-sig,逐一替换encoding参数尝试即可 - 确认文件实际编码:可打印原始字节内容
print(resp.content[:500])查看字符特征,确认匹配的编码类型 - 升级pandas版本:旧版本pandas存在编码处理bug,可执行
pip install --upgrade pandas升级到最新版本后重试
内容的提问来源于stack exchange,提问作者Oleksii Sydorchuk
相关产品推荐
相关产品推荐

