You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:38:57