Python 2.7.14中使用strptime处理法语日期格式遇阻
解决Python strptime解析法语Unicode日期字符串的问题
这个问题其实是strptime的特性导致的——它默认使用系统的**区域设置(locale)**来解析月份名称(%B对应的部分),而默认locale通常不是法语,所以没法识别Février这种带重音的法语月份名,再加上Unicode编码的小坑,就出现了你遇到的报错。下面是具体的解决方法:
第一步:先切换到法语区域设置
在调用strptime之前,必须先把时间相关的locale设置为法语,这样%B才能正确匹配法语的月份名称。不同系统的locale名称略有差异,你可以根据自己的系统调整:
import datetime as dt import locale # 尝试设置法语locale,兼容不同系统 try: # Linux/macOS系统常用的法语locale locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8') except: # Windows系统的法语locale备选 locale.setlocale(locale.LC_TIME, 'fra') # 直接使用Unicode格式的日期字符串(不需要手动encode) date_str = "Février 2017" date_obj = dt.datetime.strptime(date_str, "%B %Y") print(date_obj) # 输出:2017-02-01 00:00:00
为什么你的原有代码会报错?
- 第一个例子里你把字符串
encode('utf-8')转成了字节串,在Python 2环境下(你引入了unicode_literals),strptime处理字节串时会用系统默认编码去解码,和你的UTF-8字节串不匹配,导致解析失败。 - 第二个例子里没有设置法语locale,
%B默认匹配的是英文月份名称,自然无法识别法语的Février,所以抛出了Unicode相关的错误。
额外提醒
- 如果你的系统没有安装法语locale,可能需要先安装它:比如Linux下可以用
sudo locale-gen fr_FR.UTF-8命令生成。 - 如果你用的是Python 3,字符串默认就是Unicode格式,不需要引入
from __future__ import unicode_literals,直接设置locale后解析即可。
内容的提问来源于stack exchange,提问作者Thibault Lorrain
相关产品推荐
相关产品推荐

