如果文件包含一组特定的字符串,我如何从文件中提取记录?
我正在分析一个包含hifen分隔记录的文件xyz.txt
。 我想基于字符串FADED:100
, AM:FF
和GG
的存在来提取记录。 随后,我需要将它们写入一个新文件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是第一个字符串)
如何使用
- 将脚本复制到空文件中,将其另存为
filter_records.py
-
使用源(具有当前记录的文件)和输出文件作为参数运行脚本,例如:
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 --- -------- --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --- --- -- --