2015-07-02 33 views
0

首先,我使用python 2.7。Python解析表數據到一個數組

我想實現的目標是將表數據從活動目錄查找中分離到數組中的「名字姓氏」項中,我可以稍後將其與不同的數組進行比較,並查看列表中的哪些用戶不匹配。

我運行dsquery group domainroot -name groupname | dsget group -members | dsget user -fn -ln,其輸出列表作爲這樣:

fn    ln    
    Peter   Brill    
    Cliff   Lach   
    Michael   Tsu    
    Ashraf   Shah    
    Greg    Coultas   
    Yi    Li    
    Brad    Black    
    Kevin   Schulte   
    Raymond   Masters (Admin) 
    James   Rapp    
    Allison   Wurst    
    Benjamin   Hammel    
    Edgar   Cuevas   
    Vlad    Dorovic (Admin)   
    Will    Wang       
dsget succeeded 

通知該列表之前和每一個數據集之後具有兩個空間。

的代碼我使用目前:

userarray = [] 
p = Popen(["cmd.exe"], stdin=PIPE, stdout=PIPE) 
p.stdin.write("dsquery group domainroot -name groupname | dsget group -members | dsget user -fn -ln\n") 
p.stdin.write("exit\n") 
processStdout = p.stdout.read().replace("\r\n", "").strip("")[266:] 
cutWhitespace = ' '.join(processStdout.split()).split("dsget")[0] 
processSplit = re.findall('[A-Z][^A-Z]*', cutWhitespace) 
userarray.append(processSplit) 
print userarray 

我的問題是,當我分裂的空白,並嘗試重新分組到「姓」,當它擊中在列表中的行有(管理員)分組會被拋棄,因爲有第三個字段。這裏是我的意思的一個樣本:

['Brad ', 'Black ', 'Kevin ', 'Schulte ', 'Raymond ', 'Masters (', 'Admin) ', 'James ', 'Rapp ', 'Allison ', 'Wurst ', 

我將不勝感激關於如何更好或正確地進行分組的任何建議。謝謝!

+0

快速解決方法是刪除行中括號旁邊的空白,然後拆分,然後重新組。但njzk2s的答案是更好! – sdemurjian

+0

看起來線條可以按位置分析。使用切片來獲得前20個字符,左右修剪,然後抓取過去20的所有內容,然後左右修剪。 –

回答

1
# the whole file. 
content = p.stdout.read() 
# each line as a single string 
lines = content.split() 
# lets drop the header and the last line 
lines = lines[1:-1] 
# Notice how the last name starts at col 19 
names = [(line[:19].strip(), line[19:].strip()) for line in lines] 
print(names) 
=> [('Peter', 'Brill'), ('Cliff', 'Lach'), ('Michael', 'Tsu'), ('Ashraf', 'Shah'), ('Greg', 'Coultas'), ('Yi', 'Li'), ('Brad', 'Black'), ('Kevin', 'Schulte'), ('Raymond', 'Masters (Admin)'), ('James', 'Rapp'), ('Allison', 'Wurst'), ('Benjamin', 'Hammel'), ('Edgar', 'Cuevas'), ('Vlad', 'Dorovic (Admin)'), ('Will', 'Wang')] 

現在,如果列的大小變化,只是做index = lines[0].indexof('ln')下降的頭和用它來代替19

+0

我需要將行更改爲'lines = content.split(「\ r \ n」)'將數據解析爲'('Firstname','Lastname') – rayray84

+0

stdout還應該有一個'readlines()'方法,所以'lines = p.stdout.readlines()'也應該工作 – njzk2

0

splitmaxsplit說法你,讓你可以告訴它拆分只有第一個分離器之前,所以你可以說:

cutWhitespace = ' '.join(processStdout.split(None,1)).split("dsget")[0] 

你的第六行告訴它分裂不超過一次。