鱼C论坛

 找回密码
 立即注册
查看: 1012|回复: 7

[已解决]循环读取文本指定内容进行替换并写入新文本

[复制链接]
发表于 2020-5-26 19:23:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 菜鸟江湖 于 2020-5-26 19:31 编辑

我之前发过帖子最后还是没有解决,我用别的方式解决需求了,但是最近还是遇到问题还是需要想办法走老路解决,我想过用列表然后在读取但是太菜了没搞定,请各路大神帮忙看下怎么实现。
需求:
1、提取文本中两个"!"之间的内容(两个!之间的内容是跨行内容
2、对提取的对象进行处理,处理完成后写入新文本
3、循环第二步,直到文本读完
4、把没有math到的部分做标记也写入新文本
  1. #txt内容为:
  2. """
  3. !
  4. spanning-tree mode mst
  5. spanning-tree portfast bpduguard default
  6. spanning-tree extend system-id
  7. !
  8. spanning-tree mst configuration
  9. name gmcc
  10. revision 2
  11. instance 1 vlan 1-4094
  12. !
  13. spanning-tree mst 1 priority 24576
  14. diagnostic bootup level minimal
  15. diagnostic cns publish cisco.cns.device.diag_results
  16. diagnostic cns subscribe cisco.cns.device.diag_commands
  17. fabric timer 15
  18. !
  19. vlan internal allocation policy ascending
  20. vlan access-log ratelimit 2000
  21. !
  22. vlan 2
  23. name MMIntranet
  24. !
  25. vlan 3
  26. !
  27. vlan 4
  28. name YiJiLouGuanLi
  29. !
  30. """

  31. #下面是我之前写的脚本,是逐行读取文本进行对象处理的
  32. def match_1(new_filename,line_number,line):
  33. #        sys.stdout.write("                              \r")
  34. #        sys.stdout.write("正在收集第"+line_number+"行!\r")
  35. #一、全局替换"!"为"#"
  36.         match_Obj_1 = re.match(r'^(!)\n, line, re.I)
  37.         if match_Obj_1 != None:
  38.                 with open(new_filename, "a", encoding="UTF-8") as file:
  39.                         file.write('#'+'\n')
  40.                 return
  41. #二、替换vlan和vlan描述
  42.         match_Obj_1=re.match(r'^vlan (\d)(.*),line,re.I)
  43.         if match_Obj_1 != None :
  44.                 with open(new_filename,"a",encoding="UTF-8") as file :
  45.                         file.write('vlan '+match_Obj_1.group(1)+re.sub(r',','\nvlan ',(re.sub(r'-',' to ',match_Obj_1.group(2))))+'\n')
  46.                 return
  47. #十、将没有match到的line直接写入文本并添加注释"//"
  48.         with open(new_filename,"a",encoding="UTF-8") as file :
  49.                 file.write("//"+line)
  50.         return

  51. #输入需要打开的文件和输出文件的名字
  52. old_filename=input("请输入匹配文本名字\n") + ".txt"
  53. old_filename1=old_filename + "_1.txt"
  54. new_filename=old_filename + "_Translator.txt"
  55. line_number=0
  56. #之前遇到跨行内容我想出的解决办法,直接用re.sub替换
  57. all_line=open(old_filename,"r").read()
  58. with open(old_filename1,"a") as file:
  59.         file.write(re.sub("switchport trunk encapsulation dot1q\n switchport mode trunk","switchport trunk encapsulation dot1q\n switchport trunk allowed vlan all\n switchport mode trunk",all_line))
  60. #读取匹配文本
  61. with open(old_filename1,"r",encoding="UTF-8") as file :
  62.         #把读取的每一行的数据和输入的文件名传递给 match_1
  63.         for line in file :
  64.                 line_number = line_number + 1
  65.                 match_1(new_filename,str(line_number),line)
  66. print("\n脚本结束")
  67. input()
  68. #脚本结束
复制代码
最佳答案
2020-5-26 21:08:02
本帖最后由 Twilight6 于 2020-5-26 21:09 编辑
菜鸟江湖 发表于 2020-5-26 21:05
我之前试过用正则,太菜了写不出来。。因为内容跨行处理不好失败了


看不懂你需求,你代码还带替换什么,需求都没写需要替换吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-26 20:11:47 | 显示全部楼层
用正则?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 20:29:19 | 显示全部楼层
漏上说的对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 21:05:53 | 显示全部楼层

我之前试过用正则,太菜了写不出来。。因为内容跨行处理不好失败了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 21:08:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-5-26 21:09 编辑
菜鸟江湖 发表于 2020-5-26 21:05
我之前试过用正则,太菜了写不出来。。因为内容跨行处理不好失败了


看不懂你需求,你代码还带替换什么,需求都没写需要替换吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 21:34:31 | 显示全部楼层
Twilight6 发表于 2020-5-26 21:08
看不懂你需求,你代码还带替换什么,需求都没写需要替换吧?

需求:
1、提取文本中两个"!"之间的内容(两个!之间的内容是跨行内容)
2、对提取的对象进行处理,处理完成后写入新文本
3、循环第二步,直到文本读完
4、把没有math到的部分做标记也写入新文本
可以理解为这样:
  1. import re
  2. line=open("1.txt")
  3. match_Obj_1 = re.match(r'!([.\n]*)!',line, re.MULTILINE)
  4. if match_Obj_1 != None:
  5.     print(match_Obj_1.group(1))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-28 17:02:49 | 显示全部楼层
菜鸟江湖 发表于 2020-5-26 21:34
需求:
1、提取文本中两个"!"之间的内容(两个!之间的内容是跨行内容)
2、对提取的对象进行处理,处理 ...

我想到办法解决了代码如下:
  1. def text_pre_processing(old_filename1,temp_1,line):
  2.     if line == "!\n":
  3.         if "Ethernet" in ("".join(temp_1)) and  "ip address" in ("".join(temp_1)):
  4.                 print("match到Ethernet+ip address对象啦\n")
  5.                 with open(old_filename1, "a", encoding="utf-8") as file:
  6.                     file.write("!\n"+re.sub(" ip address "," no switchport\n ip address ",("".join(temp_1)))+"!\n")
  7.                 conuter=0
  8.                 temp_1.clear()
  9.         if "switchport mode trunk" in ("".join(temp_1)) and  "switchport trunk allowed vlan" not in ("".join(temp_1)):
  10.                 print("match到+trunk+没有allowed vlan对象啦\n")
  11.                 with open(old_filename1, "a", encoding="utf-8") as file:
  12.                     file.write("!\n"+re.sub(" switchport mode trunk"," switchport mode trunk\n switchport trunk allowed vlan all",("".join(temp_1)))+"!\n")
  13.                 conuter=0
  14.                 temp_1.clear()
  15.         else:
  16.             print("没有match到对象,正常输出")
  17.             with open(old_filename1, "a", encoding="utf-8") as file:
  18.                 file.write("!\n"+"".join(temp_1)+"!\n")
  19.             conuter=0
  20.             temp_1.clear()
  21.     else:
  22.         temp_1.append(line)

  23. #输入需要打开的文件和输出文件的名字
  24. old_filename=input("请输入匹配文本名字\n") + ".txt"
  25. old_filename1=old_filename + "_1.txt"
  26. new_filename=old_filename + "_Translator.txt"
  27. line_number=0
  28. conuter=0
  29. temp_1=[]

  30. #读取匹配文本进行预处理并生成预处理文件old_filename1
  31. with open(old_filename,"r",encoding="UTF-8") as file :
  32.         #把读取的每一行的数据和输入的文件名传递给 match_1
  33.         for line in file :
  34.                 line_number = line_number + 1
  35.                 text_pre_processing(old_filename1,temp_1,line)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-28 17:07:23 | 显示全部楼层
人在家中睡,最佳天上来???我喜欢,再来一打
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 18:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表