2016-05-06 31 views
2

我是python的新手,我正在努力尋找一種方法將類似於下面的輸出格式化爲csv格式。Python - 使用不同數量的空格格式化輸出

以下代碼運行expect腳本,該腳本生成由不同數量的空格分隔的列。

out = subprocess.check_output([get_script, "|", "grep Up"], shell=True 
print out 

1501  4122:1501   Mesh 1.2.3.4 Up  262075 261927 
1502  4121:1502   Mesh 1.2.3.5 Up  262089 261552 
1502  4122:1502   Spok 1.2.3.6 Up  262074 261784 
701000703 4121:701000703  Mesh 1.2.3.7 Up  262081 261356 

我想要的是刪除所有空格並添加一個「,」分隔符。

1501,4122:1501,Mesh,1.2.3.4,Up,262075,261927 1502,4121:1502,Mesh,1.2.3.5,Up,262089,261552 1502,4122:1502,Spok,1.2.3.6,Up,262074,261784 701000703,4121:701000703,Mesh,1.2.3.7,Up,262081,261356

我可以通過與awk -v OFS=',' '{$1=$1};1' AWK實現這一點,但我在努力尋找一個python等效。

任何指導最受讚賞!

回答

0

這應該通過在re(正則表達式)庫使用sub功能是可能的測試。

import re 

table_str = """ 
1501  4122:1501   Mesh 1.2.3.4 Up  262075 261927 
1502  4121:1502   Mesh 1.2.3.5 Up  262089 261552 
1502  4122:1502   Spok 1.2.3.6 Up  262074 261784 
701000703 4121:701000703  Mesh 1.2.3.7 Up  262081 261356 
""" 

re.sub(" +", ",", table_str) 

" +"字符串中的sub功能文字上做所有空格貪婪匹配。

+1

不要使用'str'作爲變量的名字。 – styvane

+0

如果某些字段有嵌入空格會怎麼樣? – PaulMcG

+0

謝謝我喜歡這種使用正則表達式的方法。奇蹟般有效!在這種特殊情況下,沒有嵌入式空間需要擔心。 – joefernandez3

2

分割空間的每一行,然後加入結果用逗號

# The commented out step is needed if out is not a list of lines already 
# out=out.strip().split('\n') 

for line in out: 
    print ','.join(line.split()) 
+0

謝謝!評論文章是我錯過的。 out已經不是行列表,所以我嘗試的split()和joins()給出了意想不到的結果。 – joefernandez3

1

您可以轉換out如下:

import csv 
import StringIO 

out = """1501  4122:1501   Mesh 1.2.3.4 Up  262075 261927 
1502  4121:1502   Mesh 1.2.3.5 Up  262089 261552 
1502  4122:1502   Spok 1.2.3.6 Up  262074 261784 
701000703 4121:701000703  Mesh 1.2.3.7 Up  262081 261356""" 

csv_input = csv.reader(StringIO.StringIO(out), delimiter=' ', skipinitialspace=True) 

with open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 
    csv_output.writerows(csv_input) 

給你output.csv文件,其中包含:

1501,4122:1501,Mesh,1.2.3.4,Up,262075,261927 
1502,4121:1502,Mesh,1.2.3.5,Up,262089,261552 
1502,4122:1502,Spok,1.2.3.6,Up,262074,261784 
701000703,4121:701000703,Mesh,1.2.3.7,Up,262081,261356 

StringIO用於使您的out字符串顯示爲要使用的csv模塊的文件對象。

使用Python 2.7.9