Python从标题中获取列宽
我有一个类似于表的输出,我想从每一行中获取由列分隔的输入。 不幸的是,列并不总是具有相同的宽度,并且列中可能存在空白。 但该列始终从标题中描述的位置开始,并在下一个标题前的1个字段结束。 我的想法是在标题中找到单词的位置,然后用类似这样的东西分开行 var=行[第一个字:第二个字-1] var2=行[secodword:thirdword-1]Python从标题中获取列宽,python,multiple-columns,Python,Multiple Columns,我有一个类似于表的输出,我想从每一行中获取由列分隔的输入。 不幸的是,列并不总是具有相同的宽度,并且列中可能存在空白。 但该列始终从标题中描述的位置开始,并在下一个标题前的1个字段结束。 我的想法是在标题中找到单词的位置,然后用类似这样的东西分开行 var=行[第一个字:第二个字-1] var2=行[secodword:thirdword-1] Port Name Status Vlan Duplex Speed Type Eth1/1
Port Name Status Vlan Duplex Speed Type
Eth1/1 Server1 connected 1 full 10G 10Gbase-SR
Eth1/2 Server 2 notconnec 1234 full 10G SFP-1000BAS
Eth1/3 That is poss err-disab trunk full 10G 10Gbase-SR
如何获得此位置?列标题是否保持不变?如果是这样,为什么不直接读第一行并从中找出每个字段的起始位置呢 像这样的
with open("testfile.txt","r") as f:
foo = f.readline()
if foo:
titles = [foo.index(x[0]) for x in foo.split(" ") if x != ""]
print(titles)
print(foo)
如果您知道列标题,则可以执行以下操作(假设变量
line
包含以下表格:
indices = [lines[0].index(header) for header in ["Port", "Name", "Status", "Vlan", "Duplex", "Speed", "Type"]]
如果没有,则假设标题不包含空格(类似于Karmanya Aggarwal已经建议的):
或者使用正则表达式:index=[lines[0]。在[w中为w在re.split(r“\s+”,lines[0])]中的头建立索引(头)]
现在,您可以使用索引获取列值:
lines[1][indices[1]:indices[2]].strip()
# -> Server1
当然,如果表实际上是以制表符分隔的,则您需要使用。有很多方法可以做到这一点。请注意,当标题词有空格时,这通常会变得很困难(您必须开始寻找双空格作为分隔符,甚至是行内容,而不仅仅是标题)。对于您给出的示例,一个简单的正则表达式可以为您提供以下结果:
>>> import re
>>> header = 'Port Name Status Vlan Duplex Speed Type'
>>> for x in re.finditer('\w+', header): print x.start(), x.group()
...
0 Port
10 Name
25 Status
35 Vlan
45 Duplex
53 Speed
61 Type
这正是我想要做的,但如何获得列标题中每个单词的起始位置。这不会满足您的要求。这里使用
索引
是不正确的,您可以看到,如果您针对示例运行它:[0,10,25,35,45,25,61]
。您可以在字符串中的任何位置搜索第一个字母,并进行多次迭代。我使用不同的示例进行了尝试,也得到了一个位错误输出。[0、17、36、46、56、36、72]我甚至想将代码用于具有不同列标题的输出,因为这是cisco交换机上重复出现的输出样式。我们可以假设列名中没有空格吗?谢谢,它可以工作。标题词没有空格。至少在这种情况下,我找不到输出。是否有机会将两个答案标记为解决方案ion?你和evsheino都给了我一个有效的答案。Stackoverflow不允许有多个被接受的答案,尽管在流行问题上可能有几个高评分的答案,这在功能上是相同的
>>> import re
>>> header = 'Port Name Status Vlan Duplex Speed Type'
>>> for x in re.finditer('\w+', header): print x.start(), x.group()
...
0 Port
10 Name
25 Status
35 Vlan
45 Duplex
53 Speed
61 Type