如何在多个文本文件中搜索模式并写入新的多个文本文件

2024-09-29 21:36:18 发布

您现在位置:Python中文网/ 问答频道 /正文

import re
import glob
import os

list_of_files = glob.glob('10.123.130*.txt')
pattern = re.compile(r"^\S+ \S+ \S+ 205\d+.*$")

extract_on = False
extracts_eds_upe = []


for fileName in list_of_files:
   with open(fileName, 'r') as myfile:
      print(myfile)
      #lines = myfile.readlines()
      for line in myfile:
          if pattern.search(line) :
             extract_on = True
             extracts_eds_upe.append((line.rstrip('\n')))

      with open(os.path.join(r'D:\Python Project\DRP\UPE', os.path.basename(fileName)), 'w') as mytext:
          for line in extracts_eds_upe :
             mytext.write("undo ")
             mytext.write(line)
             mytext.write('\n')

------输入文件#1------

#
FTP server-source -i LoopBack0
FTP client-source -i LoopBack0
#
info-center loghost source LoopBack0
mpls switch-l2vc 10.123.146.97 205148001 tunnel-policy TE between 10.123.130.1 205148003 tunnel-policy TE backup 10.123.130.2 205148003 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.124.24.165 205495401 tunnel-policy TE between 10.123.130.1 205495403 tunnel-policy TE backup 10.123.130.2 205495403 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.123.146.53 205145401 tunnel-policy TE between 10.123.130.1 205145403 tunnel-policy TE backup 10.123.130.2 205145403 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.123.146.49 213145001 tunnel-policy TE between 10.123.130.1 213145003 tunnel-policy TE backup 10.123.130.2 213145003 tunnel-policy TE encapsulation vlan
#

------输入文件#2------

#
FTP server-source -i LoopBack0
FTP client-source -i LoopBack0
#
info-center loghost source LoopBack0
mpls switch-l2vc 10.123.146.85 205148001 tunnel-policy TE between 10.123.130.1 205148003 tunnel-policy TE backup 10.123.130.2 205148003 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.124.24.16 205495401 tunnel-policy TE between 10.123.130.1 205495403 tunnel-policy TE backup 10.123.130.2 205495403 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.123.146.49 213145001 tunnel-policy TE between 10.123.130.1 213145003 tunnel-policy TE backup 10.123.130.2 213145003 tunnel-policy TE encapsulation vlan
#

-----------期望输出文件#1-----------------

mpls switch-l2vc 10.123.146.97 205148001 tunnel-policy TE between 10.123.130.1 205148003 tunnel-policy TE backup 10.123.130.2 205148003 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.124.24.165 205495401 tunnel-policy TE between 10.123.130.1 205495403 tunnel-policy TE backup 10.123.130.2 205495403 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.123.146.53 205145401 tunnel-policy TE between 10.123.130.1 205145403 tunnel-policy TE backup 10.123.130.2 205145403 tunnel-policy TE encapsulation vlan

-----------期望输出文件#2-----------------

mpls switch-l2vc 10.123.146.85 205148001 tunnel-policy TE between 10.123.130.1 205148003 tunnel-policy TE backup 10.123.130.2 205148003 tunnel-policy TE encapsulation vlan
mpls switch-l2vc 10.124.24.16 205495401 tunnel-policy TE between 10.123.130.1 205495403 tunnel-policy TE backup 10.123.130.2 205495403 tunnel-policy TE encapsulation vlan

我在文件中有多个文本文件和搜索模式,然后写入新文件。但现在输出多个文本的结果是相同的,实际上应该不一样。 现在的问题是,当读取文本文件并匹配目标的模式,然后写入新文件,然后读取第二个文件并匹配模式,然后再写入文件,但当写入第二个文件时,会从第二个文件开始添加第二个文件,我不希望这样,我希望在每个文件输出中分离结果模式,任何人都可以帮我


Tags: 文件sourcepolicylinebetweenmyfilebackuptunnel
2条回答

我只是稍微修改了你的代码,请看,它应该可以工作

import re
import glob
import os

list_of_files = glob.glob('10.123.130*.txt')
pattern = re.compile(r"^\S+ \S+ \S+ 205\d+.*$")

for fileName in list_of_files:
   with open(fileName, 'r') as myfile:
      print(myfile)
      # Moved inside the loop.
      extract_on = False
      extracts_eds_upe = []

      for line in myfile:
          if pattern.search(line) :
             extract_on = True
             extracts_eds_upe.append((line.rstrip('\n')))

      # Moved inside the loop.
      with open(os.path.join(r'D:\Python Project\DRP\UPE', os.path.basename(fileName)), 'w') as mytext:
          for line in extracts_eds_upe :
              mytext.write("undo ")
              mytext.write(line)
              mytext.write('\n')

单线分解器,仅供参考:

find . -type f -name "10.123.130*.txt" | xargs -I{} sh -c "grep -E '^\S+ \S+ \S+ 205\d+.*$' {} > {}.result"

说明:

  1. find . -type f -name "10.123.130*.txt",列出当前目录下所有匹配的文件
  2. xargs -I{} sh -c,将find结果按行拆分,并将它们逐个传递给下一个grep
  3. grep -E '^\S+ \S+ \S+ 205\d+.*$',按regex匹配内容并输出到stdout
  4. > {}.result,将grep结果重定向到名为source filename且后缀为.result的新文件

享受吧

相关问题 更多 >

    热门问题