2015-01-09 34 views
0

我有一個這樣的表,它會增長和縮小: 它包括選項卡,新行等當然。它是一個字符串。Pythonic解析表?

Interface  group   vlan ver               
fa1/6   239.0.0.3  2  2                
fa1/2   239.0.0.1  1  2  
fa1/1   239.0.0.0  3  2 
fa1/6   239.0.0.1  1  2 

我想分析它的格式

vlan ports 
---- ----- 
    1 fa1/2, fa1/6 
    2 fa1/6 
    3 fa1/1 

但是我這樣做是很凌亂的樣子,我覺得有更字符串處理事情比我更需要,分割,分揀等等你會用什麼方法?

+1

請發表您的代碼 – MattDMo

+0

凡/如何存儲在大串?你可以改變它使用sqllite數據庫,CSV文件或類似的? –

+0

@TomDalton我無法改變它的存儲方式,它是作爲字符串從命令行應用程序中檢索的,我運行該命令,數據返回給我(我用子進程將其作爲字符串捕獲)。馬特,我現在不在這臺電腦,我比其他代碼更感興趣的邏輯過程代碼 – Paul

回答

1

一個三步法:

  1. 轉換文本行到字典
  2. 數組
  3. 迭代字典數組來分組乙醚你想創建另一個字典的信息。
  4. 將結果字典打印成表格。

例子:

foo="""Interface  group   vlan ver 
fa1/6   239.0.0.3  2  2 
fa1/2   239.0.0.1  1  2 
fa1/1   239.0.0.0  3  2 
fa1/6   239.0.0.1  1  2 
""" 

def parse_lines(lines): 
    headers = lines[0].split() 
    entries = [] 
    for r in lines[1:]: 
    if not len(r): continue # skip blank lines 
    vals = r.split() 
    e = dict(zip(headers,vals)) 
    entries.append(e) 
    return entries 

def doit(): 
    entries = parse_lines(foo.split("\n")) 
    ports = {} 
    for e in entries: 
    vlan = e["vlan"] 
    if not (vlan in ports): ports[vlan] = [] 
    ports[vlan].append(e["Interface"]) 
    print "%6s %s" % ("vlan", "ports") 
    for vlan in ports: 
    print "%6s %s" % (vlan, ', '.join(ports[vlan])) 

doit() 
+0

我最喜歡這個,因爲它是標準的Python – Paul

2

嘗試pandas

import pandas as pd 
from StringIO import StringIO 

s = """Interface  group   vlan ver               
fa1/6   239.0.0.3  2  2                
fa1/2   239.0.0.1  1  2  
fa1/1   239.0.0.0  3  2 
fa1/6   239.0.0.1  1  2""" 
header = "vlan ports\n---- -----\n" 

現在你可以這樣做:

>>> df = pd.read_csv(StringIO(s), delim_whitespace=True)\ 
      .groupby('vlan')['Interface']\ 
      .apply(lambda x: ', '.join(x)) 
>>> print(header + df.to_string()) 
vlan ports 
---- ----- 
1  fa1/2, fa1/6 
2    fa1/6 
3    fa1/1