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

Python实现gzip文件条件行读取及代码性能优化求助

问题:匹配gzip文件中指定pattern后的目标行并优化代码

字典结构示例

Details = {1254: ["abcd_qw[5]", 56], 4654: ["ghfd_yt[7]", 42]}

gzip文件内容示例

"pattern 1": Some content... {  // 存在诸多类似pattern,仅需匹配字典key对应的pattern
    Some lines...
   "ghdf_yt[7]"=Some content...
   "abcd_qw[5]"=Some content...
 }
"pattern 1254": Some content... {
   Some lines...
   "ghdf_yt[7]"=Some content...
   "abcd_qw[5]"=Some content...
   Other pins contents...
 }
"pattern 4654": Some content... {
   Some lines...
   "ghdf_yt[7]"=Some content...
   "abcd_qw[5]"=Some content...
   Other pin contents...
  }

类似内容还有多行...

需求

读取gzip文件时,当匹配到包含"pattern 1254"的行后,继续读取后续行,直到找到包含abcd_qw[5]的行并输出;同理处理字典中其他key对应的pattern和目标字符串。

现有代码

file = gzip.open(stil_file, 'r')

for line in stil_file.readlines():
    for (key, value) in Details.items():
        string1 = "\"pattern " + str(key) + "\":"
        if string1.encode('utf-8') in line:
            print(line)
            string2 = "\"" + str(value[0]) + "\"="
            if string2.encode('utf-8') in line:
                print(line)

当前问题

代码仅能输出匹配的pattern行,无法输出后续的目标行——因为匹配到pattern行后,只会检查当前行是否包含目标字符串,不会继续遍历后续行。同时代码存在效率问题:一次性读取所有行占用内存,循环内重复拼接字符串浪费资源。


修正后的代码及优化说明

import gzip

# 定义你的字典(注意字符串需加引号)
Details = {1254: ["abcd_qw[5]", 56], 4654: ["ghfd_yt[7]", 42]}

# 预编译所有匹配规则:pattern行字符串 -> 目标行字符串
pattern_rules = {}
for key, (target_pin, _) in Details.items():
    pattern_line = f'"pattern {key}":'
    target_line = f'"{target_pin}"='
    pattern_rules[pattern_line] = target_line

with gzip.open(stil_file, 'rt', encoding='utf-8') as file:
    active_target = None  # 标记是否进入目标pattern块,存储当前要找的目标字符串
    for line in file:
        stripped_line = line.strip()
        # 未处于目标块时,检查是否匹配某个pattern行
        if active_target is None:
            for pattern, target in pattern_rules.items():
                if pattern in line:
                    print(stripped_line)
                    active_target = target
                    break
        # 处于目标块时,检查是否找到目标行
        else:
            if active_target in line:
                print(stripped_line)
                active_target = None  # 重置状态,可继续匹配下一个块
                # 若只需匹配第一个目标块,可添加break直接退出循环
                # break

优化点说明

  1. 资源管理:使用with语句自动管理文件句柄,避免资源泄漏。
  2. 文本模式读取:用rt模式打开文件,直接读取字符串,无需手动处理字节编码转换,避免混淆。
  3. 预编译规则:提前生成所有需要匹配的pattern和目标字符串,避免循环内重复拼接,提升运行效率。
  4. 逐行读取:避免一次性加载整个文件到内存,适合处理大体积gzip文件。
  5. 状态标记:通过active_target标记是否进入目标块,减少不必要的匹配操作,提升遍历效率。

内容的提问来源于stack exchange,提问作者PARTH KHAMAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:27:30