如何解决如何使用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 我认为您正在寻找相同的答案,谢谢,那里已经解释过了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。