首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多个文本文件中搜索模式并写入新的多个文本文件

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

Stack Overflow用户
提问于 2021-08-08 07:55:51
回答 2查看 129关注 0票数 1
代码语言:javascript
复制
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')

-输入file#1

代码语言:javascript
复制
#
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
#

-输入file#2

代码语言:javascript
复制
#
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
#

-预期输出file#1

代码语言:javascript
复制
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

-预期输出file#2

代码语言:javascript
复制
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

我在文件中有多个文本文件和搜索模式,然后现在写到新的file.But中,输出多个文本的结果是一样的,实际上应该是不一样的。现在的问题是,当读取文本文件和匹配目标的模式,然后写到新文件,然后读取到第二个文件,匹配模式后也写入文件,但是当写入第二个文件时,我不想先从第二个文件中追加模式,这样我想在每个文件输出中分离出结果模式,任何人都可以帮助我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-09 07:17:11

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

代码语言:javascript
复制
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')
票数 1
EN

Stack Overflow用户

发布于 2021-08-10 05:30:14

一行解析器,FYI:

代码语言:javascript
复制
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",列出当前directory.
  2. xargs -I{} sh -c,下的所有匹配文件,将find结果按行拆分,并通过one.
  3. grep -E '^\S+ \S+ \S+ 205\d+.*$',将它们传递给下一个grep,通过regex匹配内容并输出到stdout.
  4. > {}.result,,将grep结果重定向到带有.result后缀.

的名为源文件名的新文件。

尽情享受吧!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68698830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档