[ datetime.strptime解析异常 ]


第一次执行没事

第二次执行报错

ValueError: time data '3,2021 4:23:55 AM' does not match format '%m,%Y %I:%M:%S %p'

原因是一开始的时候, locale默认的语言是none, 一开始执行datetime.strptime缓存的语言是none, %p转化成的正则表达式是"AM/PM" 第一次执行cv2.imshow会强制设置locale的语言为当前计算机默认语言,我这里就是中文, 循环第二次执行到datetime.strptime检测到locale发生变化,会重新缓存语言是中文,解析%p的正则表达式就变成了"上午/下午" 从而导致报错

from datetime import datetime
import locale
import cv2

video = cv2.VideoCapture("/home/chf/视频/KBD test case 01-02/KBD_m1.mp4")
for _ in range(5):
    return_value, frame = video.read()

return_valu = 1
set_locale = 0
while return_valu < 100:
    return_value, frame = video.read()
    a = datetime.strptime("3,2021 4:23:55 AM", "%m,%Y %I:%M:%S %p")
    key = cv2.waitKey(20)
    if key == 113:
        video.release()
        break
    cv2.imshow(
        "test",
        (1920, 1080),
    )
    if set_locale == 0:
        locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
        set_locale = 1
    return_valu += 1

解决方法:

  • 方法1. 第一次执行完成cv2.imshow之后进行设置locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')一次就可以
  • 反法2. 直接设置当前计算机的默认语言为en_US.UTF-8即可
# 修改当前计算机语言
sudo vim /etc/locale.gen
找到 en_US.UTF-8 UTF-8 行并取消注释(去掉行首的 #)。

生成语言环境:
sudo locale-gen

# 查看
(base) chf@chf:~$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=