我在“发展”一个清理TXT行的脚本方面遇到了问题,附带的TXT示例如下:
Fri Oct 14 22:27:49.100 EDT
Interface Status Protocol Description
--------------------------------------------------------------------------------
Lo0 up up Loopback0 interface configured by Netmiko
Lo55 up up
Lo100 up up ***MERGE LOOPBACK 100****
Lo111 up up Configured by NETCONF
Nu0 up up
Mg0/RP0/CPU0/0 up up DO NOT TOUCH THIS !
Gi0/0/0/0 admin-down admin-down ANSIBLE NXOS TEST
Gi0/0/0/1 admin-down admin-down test
Gi0/0/0/1.100 admin-down admin-down
Gi0/0/0/2 admin-down admin-down Link to P2 configured by Netmiko
Gi0/0/0/3 up up Configured by Ansible !!!!!!!!
Gi0/0/0/4 up up Updated by Ansible using Jinja Template
Gi0/0/0/5 up up Configured by Ansible !!!!!!
Gi0/0/0/6 admin-down admin-down Updated by Ansible using Jinja Template
Gi0/0/0/6.11 admin-down admin-down
Lo20 admin-down admin-down
Lo22 up up Loopback para pruebas
[K --More-- [KLo69 admin-down admin-down
Gi0/3/3/4 up up A SDH
Gi0/3/3/4.852 up up TMU a Red BIT
[K --More-- [KGi0/3/3/4.853 up up Configured by Ansible !!!!!!
Gi0/3/4/2.256 up up Frontera Cliente A
Gi0/3/4/2.257 up up Frontera Cliente B
[K --More-- [KGi0/3/4/2.261 up up Frontera Cliente C
Te0/7/0/3 admin-down admin-down
Mg0/RP0/CPU0/0 down down
Mg0/RP1/CPU0/0 admin-down admin-down
[KRP/0/RP0/CPU0:ROUTER1# 剧本如下:
list_txt = [ruta/"prueba.txt"]
for txt in list_txt:
with open(txt, "r") as f:
lines = f.readlines()
with open(txt, "w") as fw:
for line in lines:
if not re.match("-{5}|\s+|([A-Za-z0-9]+( [A-Za-z0-9]+)+)", line):
fw.write(line)有了这个脚本,我可以删除所有上面日期的行、空行和它们是纯连字符的行,问题是我试图添加两样东西:
1-在regex中添加,如果其中包含"CPU“一词,则行将被删除:
Mg0/RP0/CPU0/0 down down
Mg0/RP1/CPU0/0 admin-down admin-down
[KRP/0/RP0/CPU0:ROUTER1# 2.另一方面,我需要删除一些行中添加的奇怪的内容,例如:
[K --More-- [KLo69 admin-down admin-down让它像这样干净:
Lo69 admin-down admin-down最后一个我尝试通过txt.lstrip("[K")来实现它,但是没有效果,我做的不对,它不工作,Regex我也没有按键,我也不能添加CPU这个词,我不太清楚如何生成Regex。
理想情况下,我希望你能把所有的东西都添加到现有的脚本中,这样就不会让事情变得那么复杂,你能帮我一下吗?
发布于 2022-10-31 20:00:40
我认为正则表达式在这里并没有什么区别,只是可能解析标题,这样您就可以知道某一列的数据将从哪个索引开始:
spans = []
result = []
with open(txt, "r") as f:
it = iter(f.readlines())
# Skip lines until headings are found
for line in it:
if " " in line:
break
# Get start/end indices of each column
spans = [
m.span()
for m in re.finditer(r"\S+\s*", line)
]
spans[-1] = (spans[-1][0], -1)
next(it) # Skip line with just hyphens
# Iterate the real data part of the input
for line in it:
if line.startswith("[K --More--"):
# Get content part of this line
line = line[line.index("[K", 10) + 2:]
elif line.startswith("[K") or "/CPU" in line:
continue # Not interested
result.append(tuple(line[start:end].rstrip() for start, end in spans))
# Output what was collected:
for record in result:
print(record)给定示例文件的输出是:
('Lo0', 'up', 'up', 'Loopback0 interface configured by Netmiko')
('Lo55', 'up', 'up', '')
('Lo100', 'up', 'up', '***MERGE LOOPBACK 100****')
('Lo111', 'up', 'up', 'Configured by NETCONF')
('Nu0', 'up', 'up', '')
('Gi0/0/0/0', 'admin-down', 'admin-down', 'ANSIBLE NXOS TEST')
('Gi0/0/0/1', 'admin-down', 'admin-down', 'test')
('Gi0/0/0/1.100', 'admin-down', 'admin-down', '')
('Gi0/0/0/2', 'admin-down', 'admin-down', 'Link to P2 configured by Netmiko')
('Gi0/0/0/3', 'up', 'up', 'Configured by Ansible !!!!!!!!')
('Gi0/0/0/4', 'up', 'up', 'Updated by Ansible using Jinja Template')
('Gi0/0/0/5', 'up', 'up', 'Configured by Ansible !!!!!!')
('Gi0/0/0/6', 'admin-down', 'admin-down', 'Updated by Ansible using Jinja Template')
('Gi0/0/0/6.11', 'admin-down', 'admin-down', '')
('Lo20', 'admin-down', 'admin-down', '')
('Lo22', 'up', 'up', 'Loopback para pruebas')
('Lo69', 'admin-down', 'admin-down', '')
('Gi0/3/3/4', 'up', 'up', 'A SDH')
('Gi0/3/3/4.852', 'up', 'up', 'TMU a Red BIT')
('Gi0/3/3/4.853', 'up', 'up', 'Configured by Ansible !!!!!!')
('Gi0/3/4/2.256', 'up', 'up', 'Frontera Cliente A')
('Gi0/3/4/2.257', 'up', 'up', 'Frontera Cliente B')
('Gi0/3/4/2.261', 'up', 'up', 'Frontera Cliente C')
('Te0/7/0/3', 'admin-down', 'admin-down', '')我可能错过了您的一些需求,但我认为使用这种方法很容易适应。
发布于 2022-11-01 22:43:19
我补充了我能够以尽可能简化的方式给出的最后解决办法:
for txt in list_txt:
with open(txt, "r") as f:
lines = f.readlines()
with open(txt, "w") as fw:
for line in lines:
if re.match("-{5}|\s+|([A-Za-z0-9]+( [A-Za-z0-9]+)+)", line) or re.search("CPU", line):
pass
elif "[K" in line:
line2 = line.rindex("[K")
line3 = line[line2+2:]
fw.write(line3)
else:
fw.write(line)https://stackoverflow.com/questions/74267519
复制相似问题