Python从标题获取列宽

时间:2017-07-27 06:41:39

标签: python multiple-columns

我有一个像输出这样的表,我希望从列分隔的每一行得到输入。 不幸的是,列并不总是具有相同的宽度,并且列内可能有空格。 但该列始终从标题中描述的位置开始,并在下一个标题之前结束1字段。 我的想法是在标题中获得单词的位置,然后用

之类的东西分割

var = line [firstword:secondword-1] var2 = line [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

我怎样才能获得这个职位?

3 个答案:

答案 0 :(得分:1)

如果您知道列标题,则可以执行以下操作(假设变量lines包含表格:

indices = [lines[0].index(header) for header in ["Port", "Name", "Status", "Vlan", "Duplex", "Speed", "Type"]]

如果你没有,那么假设标题不包含空格(类似于Karmanya Aggarwal已经建议的那样):

indices = [lines[0].index(header) for header in [w for w in lines[0].split(" ") if w != ""]]

或使用正则表达式:indices = [lines[0].index(header) for header in [w for w in re.split(r"\s+", lines[0])]]

现在您可以使用索引获取列值:

lines[1][indices[1]:indices[2]].strip()
# -> Server1

当然,如果表格实际上是以制表符分隔的,那么您将要使用csv module代替。

答案 1 :(得分:1)

有很多方法可以做到这一点。请注意,当标题词具有空格时(您开始必须将双空格作为拆分,或者甚至在行的内容而不仅仅是标题中),这变得很困难。对于您给出的示例,一个简单的正则表达式可以为您提供结果:

>>> 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

答案 2 :(得分:0)

列标题是否不变?如果是这样,为什么不直接读取第一行并从中找出每个字段的起始位置?

这样的东西?

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)