如果文件包含一组特定的字符串,我如何从文件中提取记录?

我正在分析一个包含hifen分隔记录的文件xyz.txt 。 我想基于字符串FADED:100AM:FFGG的存在来提取记录。 随后,我需要将它们写入一个新文件faded100.txt 。 源文件包含超过4万条记录,如下所示。

 --- -------- ---  -   -   -   -   -   -   -   -   -   -   -   -   -   -  --- ---  -  - 

     rtuyss A / A去吧去去吧去吧去吧去IRE AP QQ Z.
订单xxxxxxx1

国家:201 NVDS TEMPROR EXTREME

巴士时间:TRASS:12 AIDED:12 FADED:100

                       UUU u UAUOOOOOOO
                  GG YYYYYOYOOOOOOO POU
 ATM UNITED#AM:FF YYYYYOYOOOOOOO POU POU POU POU
 --- -------- ---  -   -   -   -   -   -   -   -   -   -   -   -   -   -  --- ---  -  - 

 rtuyss A / A去吧去去吧去吧去吧去IRE AP QQ Z.
订单xxxxxxx1

国家:201 NVDS TEMPROR EXTREME

巴士时间:TRASS:12 AADED:12 FADED:200

                       UUU u UAUOOOOOOO
                   ZZ YYYYYOYOOOOOOO POU
 ATM UNITED#AM:FF YYYYYOYOOOOOOO POU POU POU POU

 --- -------- ---  -   -   -   -   -   -   -   -   -   -   -   -   -   -  --- ---  -  - 

 rtuyss A / A去吧去去吧去吧去吧去IRE AP QQ Z.
订单xxxxxxx1

国家:201 NVDS TEMPROR EXTREME

巴士时间:TRASS:12 AIDED:12 FADED:100

                      UUU u UAUOOOOOOO
                   IP YYYYYOYOOOOOOO POU
 ATM UNITED#AM:FF YYYYYOYOOOOOOO POU POU POU POU

 --- -------- ---  -   -   -   -   -   -   -   -   -   -   -   -   -   -  --- ---  -  - 

如果可以在记录中找到一组字符串,则从文本文件中提取记录

如果符合您在问题中描述的条件,则下面的脚本将从您的文件中提取记录。 如果订单很重要,请参阅我的笔记如果订单很重要

由于脚本每行读取文件,然后处理每条记录的行,因此对于大文件应该非常快。

剧本

 #!/usr/bin/env python3 import sys #--- set the strings to be (needed to be) found below checks = ["FADED: 100", "AM:FF", "GG"] #--- f = sys.argv[1]; out = sys.argv[2]; rec = []; test = [] with open(f) as src, open(out, "a+") as targ: for l in src: rec.append(l) if l.startswith("---"): if len(test) == 3: for l in rec: targ.write(l) rec = []; test = [] else: for s in checks: if s in l: test.append(checks.index(s)) break 

脚本的作用完全正确

  • 脚本读取记录(每行加载),如果在行中出现任何字符串["FADED: 100", "AM:FF", "GG"] ,则保持同时记录。
  • 如果不是所有三个字符串都出现在记录中,则记录将从“缓存”中删除,下一条记录将被加载,依此类推

如果订单很重要

如果重要的是哪个顺序 (包含 – 行)字符串出现在记录中,您可以替换该行:

 if len(test) == 3: 

通过:

 if test == [0, 2, 1] 

其中数字引用列表中字符串的索引 checks = ["FADED: 100", "AM:FF", "GG"] (其中0是第一个字符串)

如何使用

  1. 将脚本复制到空文件中,将其另存为filter_records.py
  2. 使用源(具有当前记录的文件)和输出文件作为参数运行脚本,例如:

     python3 /path/to/filter_records.py /path/to/inputfile.txt /path/to/outputfile.txt 

结果(在你的小例子上)

  rtuyss A/A go go go go go go go go go go go go go go IRE AP QQ Z ORDER xxxxxxx1 country: 201 NVDS TEMPROR EXTREME BUS TIME: TRASS: 12 AIDED: 12 FADED: 100 UUU u UAUOOOOOOO GG YYYYYOYOOOOOOO POU ATM UNITED # AM:FF YYYYYOYOOOOOOO POU POU POU POU --- -------- --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --- --- -- --