如何从测试文件指定字段提取datetime字符串并转换为指定日期格式
问题直接原因
你触发报错的核心是把re.search返回的匹配对象直接传给了re.sub,后续把返回的字符串当做匹配对象调用group方法,同时代码存在正则不匹配、拼写错误、缩进错误、逻辑流程错误等多个问题,修复方案如下:
修复后完整可运行代码
import re import os from datetime import datetime basepath = r"C:\Users\xyz\test" def extract_date(fn): # 正则适配测试文本的CST时区、双冒号时间格式 pattern = r'Tested on: \S+ (\S+) (\d+) \d+::\d+:\d+ CST (\d+)' with open(fn, encoding='utf-8', errors='ignore') as f: for s in f: m = re.search(pattern, s) if m: # 直接从匹配对象取对应分组,无需冗余替换 month_str = m.group(1) day = m.group(2) year = m.group(3) # 用%b自动匹配月份缩写,无需手动做映射 date_obj = datetime.strptime(f"{day} {month_str} {year}", "%d %b %Y") # 要输出月份数字用'%d/%m/%Y',要输出月份缩写用'%d/%b/%Y' dt_out = date_obj.strftime('%d/%m/%Y') return (os.path.basename(fn), dt_out) return None if __name__=="__main__": dates = [] for root, _, filenames in os.walk(basepath): for filename in filenames: full_path = os.path.join(root, filename) res = extract_date(full_path) if res: dates.append(res) print(res) print("所有提取结果:", dates)
主要改动点
- 修正缩进错误:原函数内读取文件行的逻辑完全没有正确缩进,导致只读取了文件最后一行甚至未读取
- 修正正则表达式:将错误的时区
AET改为测试文本中的CST,适配现有文本格式 - 修正拼写错误:将错写的
dataetime改为正确的datetime,并调整导入逻辑 - 删除冗余的
re.sub逻辑:匹配成功后直接从匹配对象取对应分组,无需做字符串替换 - 修正日期解析格式:用
%b匹配月份缩写(Mar对应3月),无需手动做月份映射 - 修复路径拼接逻辑:用
os.path.join拼接路径,避免不同系统的路径分隔符兼容问题 - 补充返回值收集逻辑:将所有文件的匹配结果存入
dates列表统一处理
如果你需要输出的是
31/Mar/2021格式的日期,只需要把strftime的格式字符串改为'%d/%b/%Y'即可。
内容的提问来源于stack exchange,提问作者Geek_Coder
相关产品推荐
相关产品推荐

