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
优化点说明
- 资源管理:使用
with语句自动管理文件句柄,避免资源泄漏。 - 文本模式读取:用
rt模式打开文件,直接读取字符串,无需手动处理字节编码转换,避免混淆。 - 预编译规则:提前生成所有需要匹配的pattern和目标字符串,避免循环内重复拼接,提升运行效率。
- 逐行读取:避免一次性加载整个文件到内存,适合处理大体积gzip文件。
- 状态标记:通过
active_target标记是否进入目标块,减少不必要的匹配操作,提升遍历效率。
内容的提问来源于stack exchange,提问作者PARTH KHAMAR
相关产品推荐
相关产品推荐

