Python从标题中获取列宽

Python从标题中获取列宽,python,multiple-columns,Python,Multiple Columns,我有一个类似于表的输出,我想从每一行中获取由列分隔的输入。 不幸的是,列并不总是具有相同的宽度,并且列中可能存在空白。 但该列始终从标题中描述的位置开始,并在下一个标题前的1个字段结束。 我的想法是在标题中找到单词的位置,然后用类似这样的东西分开行 var=行[第一个字:第二个字-1] var2=行[secodword:thirdword-1] Port Name Status Vlan Duplex Speed Type Eth1/1

我有一个类似于表的输出,我想从每一行中获取由列分隔的输入。 不幸的是,列并不总是具有相同的宽度,并且列中可能存在空白。 但该列始终从标题中描述的位置开始,并在下一个标题前的1个字段结束。 我的想法是在标题中找到单词的位置,然后用类似这样的东西分开行

var=行[第一个字:第二个字-1] var2=行[secodword:thirdword-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