我有一个像输出这样的表,我希望从列分隔的每一行得到输入。 不幸的是,列并不总是具有相同的宽度,并且列内可能有空格。 但该列始终从标题中描述的位置开始,并在下一个标题之前结束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
我怎样才能获得这个职位?
答案 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)