如何修改Python代码提取文件中所有起止字符串间内容(不含结束串)
提取日志中所有标记区间内容并按年份分组展示
我明白你的需求了——你需要从日志文件里提取所有以Transfer started at开头、到Transfer completed successfully结束的内容(而且不包含结束行),还要按年份分段展示。原代码只输出最后一段,是因为每次遇到起始标记时都会重置buffer,之前提取的内容都被覆盖了。
下面是修改后的代码,完美解决这个问题:
start = "Transfer started at" end = "Transfer completed successfully" buffer = "" log = False transfers_by_year = {} # 用字典按年份存储对应内容 for line in open('test.txt'): line = line.strip('\n') # 去掉换行符,避免输出多余空行 if line.startswith(start): buffer = line log = True # 从起始行提取年份(行最后一个元素) year = line.split()[-1] elif line.startswith(end): # 遇到结束标记时,不将结束行加入buffer,直接保存当前buffer if year in transfers_by_year: transfers_by_year[year] += '\n' + buffer else: transfers_by_year[year] = buffer buffer = "" log = False elif log: buffer += '\n' + line # 按年份排序输出 for year in sorted(transfers_by_year.keys()): print(f"{year}: {transfers_by_year[year]}")
关键改动说明:
- 新增
transfers_by_year字典,用来按年份存储每一段提取到的内容,避免覆盖之前的结果 - 从起始行中提取年份(通过拆分字符串取最后一个元素),作为字典的键
- 遇到结束标记时,不再将结束行加入buffer,而是把当前整理好的buffer存入对应年份的条目
- 最后按年份排序输出,保证展示顺序符合预期
运行后预期输出:
2016: Transfer started at Fri May 27 13:50:45 BST 2016 Logs transferred successfully. Images transferred successfully. Hashes transferred successfully. 37 approvals pending. 2017: Transfer started at Fri May 27 13:50:45 BST 2017 Logs transferred successfully. Images transferred successfully. Hashes transferred successfully. ERROR: transfer not complete by end of log file 2018: Transfer started at Fri May 27 13:50:45 BST 2018 Logs transferred successfully. Images transferred successfully. Hashes transferred successfully. ERROR: transfer not complete by end of log file
内容的提问来源于stack exchange,提问作者user3014974
相关产品推荐
相关产品推荐

