如何使用python读取txt文件并将txt的一部分格式化为表格

问题描述

我正在尝试读取文本文件并将其中的特定部分提取到 CSV 文件中,

#**This is the part of the txt file:**#
- 172.16.1.202
- Hostaname: S01
#################################################################################
- VLAN-IP addressing Sheet
##########################
- VLAN + Description
--------------------
Interface                      Status         Protocol Description
Vl1                            up             up       
Vl5                            up             up       Legacy-RC-Admin
Vl20                           up             up       Legacy-RC-server
Vl30                           up             up       Legacy-RC-iSCSI
Vl40                           down           down     WAN Interconnect VLAN
Vl50                           up             up       
Vl60                           down           down     Tech FW ICS
Vl101                          up             up       RFR Data
Vl131                          down           down     Data WLAN
Vl134                          up             up       WLAN Management
Vl151                          down           down     Factory WLAN
Vl201                          up             up       RFR Management

- VLAN + IP address
--------------------
Interface              IP-Address      OK? Method Status                Protocol
Vlan1                  unassigned      YES unset  up                    up      
Vlan5                  10.26.95.33     YES NVRAM  up                    up      
Vlan20                 10.26.93.1      YES NVRAM  up                    up      
Vlan30                 10.26.93.65     YES NVRAM  up                    up      
Vlan40                 10.63.121.251   YES NVRAM  down                  down    
Vlan50                 10.50.50.54     YES NVRAM  up                    up      
Vlan60                 10.26.95.22     YES NVRAM  down                  down    
Vlan101                10.26.92.1      YES NVRAM  up                    up      
Vlan131                10.26.81.1      YES NVRAM  down                  down    
Vlan134                10.26.82.1      YES NVRAM  up                    up      
Vlan151                10.26.83.1      YES NVRAM  down                  down    
Vlan201                10.26.80.1      YES NVRAM  up                    up

- subnet Mask
-------------
Internet address is 10.210.130.10/30
  Internet address is 172.16.1.202/24
  Internet address is 151.151.151.151/32
  Internet address is 10.26.95.33/27
  Internet address is 10.26.93.1/26
  Internet address is 10.26.93.65/26
  Internet address is 10.63.121.251/28
  Internet address is 10.50.50.54/24
  Internet address is 10.26.95.22/29
  Internet address is 10.26.92.1/24
  Internet address is 10.26.81.1/24
  Internet address is 10.26.82.1/24
  Internet address is 10.26.83.1/24
  Internet address is 10.26.80.1/24
##################################################################################
- LAN Sheet
############
- Access or Trunk with VLANs
----------------------------
interface Port-channel2
 switchport trunk allowed vlan 5,20,30,101,134,201,381
interface Port-channel1
interface GigabitEthernet0/2
 switchport trunk allowed vlan 5,381
interface GigabitEthernet0/3
interface GigabitEthernet0/0
interface GigabitEthernet0/1
 channel-group 1 mode on
interface GigabitEthernet1/0
 switchport trunk allowed vlan 5,381
 channel-group 2 mode on
interface GigabitEthernet1/1
 switchport trunk allowed vlan 5,381
 channel-group 2 mode on
interface GigabitEthernet1/2
interface GigabitEthernet1/3
ip route 172.16.1.203 255.255.255.255 GigabitEthernet0/1

- Non user interface with Description
-------------------------------------
 Interface                      Status         Protocol Description
Gi0/2                          up             up       Network link to eff-e-rfr-sw-as1
Gi0/3                          up             up       
Gi0/0                          up             up       
Gi0/1                          up             up       Network link to eff-e-rfr-sw-as1
Gi1/0                          up             up       Network link to eff-e-rfr-sw-as2
Gi1/1                          up             up       Network link to eff-e-rfr-sw-as2
Gi1/2                          up             up       
Gi1/3                          up             up       
Po2                            down           down     Network link to eff-e-rfr-sw-as2
Po1                            up             up       Network link to eff-e-rfr-sw-as1
Lo50                           up             up

- Remote port
---------------
Interface: GigabitEthernet0/0,Port ID (outgoing port): Ethernet0/0
Interface: GigabitEthernet0/0,Port ID (outgoing port): GigabitEthernet0/0
Interface: GigabitEthernet0/2,Port ID (outgoing port): GigabitEthernet0/2
Interface: GigabitEthernet0/0,Port ID (outgoing port): GigabitEthernet0/0
Interface: GigabitEthernet0/0,Port ID (outgoing port): GigabitEthernet0/0
Interface: GigabitEthernet0/1,Port ID (outgoing port): GigabitEthernet0/1
Interface: GigabitEthernet0/0,Port ID (outgoing port): GigabitEthernet0/0
Interface: GigabitEthernet1/1,Port ID (outgoing port): GigabitEthernet1/1
Interface: GigabitEthernet1/0,Port ID (outgoing port): GigabitEthernet1/0
Interface: GigabitEthernet0/0,Port ID (outgoing port): mgmt0
Interface: GigabitEthernet0/0,Port ID (outgoing port): GigabitEthernet0/0/0/0

预期的输出是: the expected output

解决方法

您可以将 pandas.read_csv() 用于:

  • skiprows=8 跳过前 8 行
  • nrows=12 读取 12 行
  • sep='\s{2,}' 使用多个空格作为分隔符
  • names=['Interface','Status','Protocol','Description'] 手动设置列名,因为最后两列名之间的单个空格会干扰所需的多空格分隔符,因为最后一行在单元格中包含空格。

下一部分相同,具有调整的行值。在这里,我们可以 delim_whitespace=True 使用所有空格作为分隔符,因为值中没有带有空格的列。 pandas 现在还可以自动推断列名称,因为此表中没有带空格的值。

最后,join 两个数据帧:

import pandas as pd

df1 = pd.read_csv('filename.txt',skiprows=8,nrows=12,sep='\s{2,}',names=['Interface','Description'])
df2 = pd.read_csv('filename.txt',skiprows=23,delim_whitespace=True)
final_df = df1.join(df2,lsuffix='_decription',rsuffix='_ipaddress')

结果:

Interface_description 状态描述 Protocol_description 描述 Interface_ipaddress IP 地址 OK? 方法 Status_ipaddress Protocol_ipaddress
0 Vl1 向上 向上 Vlan1 未分配 YES 未设置 向上 向上
1 Vl5 向上 向上 Legacy-RC-Admin Vlan5 10.26.95.33 YES NVRAM 向上 向上
2 Vl20 向上 向上 Legacy-RC-server Vlan20 10.26.93.1 YES NVRAM 向上 向上
3 Vl30 向上 向上 Legacy-RC-iSCSI Vlan30 10.26.93.65 YES NVRAM 向上 向上
4 Vl40 向下 向下 WAN 互连 VLAN Vlan40 10.63.121.251 YES NVRAM 向下 向下
5 Vl50 向上 向上 Vlan50 10.50.50.54 YES NVRAM 向上 向上
6 Vl60 向下 向下 Tech FW ICS Vlan60 10.26.95.22 YES NVRAM 向下 向下
7 Vl101 向上 向上 RFR 数据 Vlan101 10.26.92.1 YES NVRAM 向上 向上
8 Vl131 向下 向下 数据无线局域网 Vlan131 10.26.81.1 YES NVRAM 向下 向下
9 Vl134 向上 向上 WLAN 管理 Vlan134 10.26.82.1 YES NVRAM 向上 向上
10 Vl151 向下 向下 工厂无线局域网 Vlan151 10.26.83.1 YES NVRAM 向下 向下
11 Vl201 向上 向上 RFR 管理 Vlan201 10.26.80.1 YES NVRAM 向上 向上

您可以将数据框保存到新的 csv 文件:final_df.to_csv('filename.csv')

,

转到此链接 Turning a text file into a tabular format 我认为您正在寻找相同的答案,谢谢,那里已经解释过了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...