【Python】识别和提取文本中的日期时出现的常见错误

本文讲述了如何使用Python解析文本文件中的时间,通过正则表达式匹配时间模式,并处理编码问题,包括使用多种时间格式解析和处理UnicodeDecodeError。作者分享了解决尝试不同时间格式和文件编码问题的方法。
摘要由CSDN通过智能技术生成

当前接到了一个任务,是要将已经有的文本文件用python编写一段代码来识别里面的时间日期(如图所示),于是在判定过程出现了几次报错,记录一下

要在Python中识别英文文本中的时间并进行相应的判断,可以使用正则表达式来匹配时间模式,然后使用日期时间库(如datetime)来进行进一步的处理和判定。

def detect_and_parse_time(text):
    # 定义时间模式的正则表达式
    time_pattern = r'\b\d{1,2}:\d{2}\s*(?:AM|PM|am|pm)?\b'

    # 使用正则表达式查找文本中的时间
    times = re.findall(time_pattern, text)

    # 解析时间并进行判定
    for time_str in times:
        # 尝试解析时间字符串
        try:
            # 将字符串转换为时间对象
            time_obj = datetime.strptime(time_str, '%I:%M %p')
            # 进行相应的判定,这里只是简单的打印
            if time_obj.hour < 12:
                print(f"{time_str} is in the morning.")
            else:
                print(f"{time_str} is in the afternoon/evening.")
        except ValueError:
            # 如果解析失败,打印错误信息
            print(f"Unable to parse time: {time_str}")

在给定的文本中查找时间模式,并尝试解析时间字符串。然后,它会根据解析后的时间对象进行相应的判定,例如判断时间是上午还是下午/晚上。

第一版代码中,正则表达式为

 # 定义时间模式的正则表达式
    time_pattern = r'\b\d{1,2}:\d{2}\s*(?:AM|PM|am|pm)?\b'

出现了

Unable to parse time: 11:32

的错误。 这个错误表明在尝试解析时间字符串 "11:32" 时出现了问题。通常,这种错误会在时间字符串格式与指定的格式不匹配时发生。

于是改为

def detect_and_parse_time_in_log(log_file_path):
    try:
        with open(log_file_path, 'r') as file:
            log_content = file.read()
    except FileNotFoundError:
        print("File not found.")
        return

    # 定义时间模式的正则表达式
    time_pattern = r'\b\d{1,2}:\d{2}\s*(?:AM|PM|am|pm)?\b'

    # 使用正则表达式查找文本中的时间
    times = re.findall(time_pattern, log_content)

    # 解析时间并进行判定
    for time_str in times:
        try:
            # 尝试使用不同的时间格式解析时间字符串
            time_obj = datetime.strptime(time_str, '%I:%M %p')
        except ValueError:
            try:
                # 尝试另一种时间格式解析时间字符串
                time_obj = datetime.strptime(time_str, '%H:%M')
            except ValueError:
                # 如果无法解析,输出错误信息并跳过
                print(f"Unable to parse time: {time_str}")
                continue
            
        # 进行相应的判定,这里只是简单的打印
        if time_obj.hour < 12:
            print(f"{time_str} is in the morning.")
        else:
            print(f"{time_str} is in the afternoon/evening.")

尝试两种不同的时间格式来解析时间字符串。如果其中一种格式能成功解析,就会继续进行相应的判定;如果两种格式都无法解析,就会输出错误信息并跳过这个时间字符串。

根据提供的原文本,时间格式为"YYYY Mon DD HH:MM:SS.sss",其中Mon是英文缩写的月份,例如 "Jun"。

那么正则表达式应为

  # 定义时间模式的正则表达式
    time_pattern = r'\b\d{4} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{2}:\d{2}:\d{2}\.\d{3}\b'

解析字符串

 # 尝试解析时间字符串
            time_obj = datetime.strptime(time_str, '%Y %b %d %H:%M:%S.%f')

报错

Unable to parse time: Jun

问题出在尝试解析月份缩写时。这是因为 %b 是用来解析英文缩写月份的,但文本中月份是完整的 "Jun" 而不是缩写 "Jun"。我们需要使用 %b 代替 %b。 后而直接匹配月份部分而不是依赖于英文缩写。

 # 定义时间模式的正则表达式
    time_pattern = r'\b\d{4} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{2}:\d{2}:\d{2}\.\d{3}\b'

UnicodeDecodeError: 'gbk' codec can't decode byte 0xbe in position 758338: illegal multibyte sequence

在尝试使用 GBK 编码解码文本时出现了问题,因为文本中包含了无法解码的字节序列。这通常是因为文本文件的编码与当前环境的编码不匹配所致。

为了解决这个问题,尝试以不同的编码方式打开文件,或者使用通用的 UTF-8 编码方式。

 

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbe in position 758338: invalid start byte 

这个错误表明尝试使用 UTF-8 编码解码文本时出现了问题,因为文本中包含了无法解码的字节序列。

这可能是因为文件的编码与您当前使用的编码方式不匹配,或者文件中包含了非法的字节序列。为了解决这个问题:

1. 指定正确的编码方式:尝试以其他编码方式打开文件,比如 'latin-1''gbk'

2. 检查文件内容:确保文件内容中没有损坏或无效的字符。有时候文件可能会损坏或包含了不可见的特殊字符。

3. 使用错误处理方式:在打开文件时指定错误处理方式,以处理无法解码的字节序列。

添加了 errors='ignore' 参数,以忽略无法解码的字节序列。这样做可能会导致一些字符被忽略,但可以让代码继续执行。

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellenionia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值