Python - 使用不同数量的空格格式化输出

时间:2016-05-06 07:39:16

标签: python python-2.7 parsing string-formatting delimiter

我是python的新手,我正在努力寻找一种方法将类似于下面的输出格式化为csv。

以下代码运行一个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与awk -v OFS=',' '{$1=$1};1'实现这一点,但我很难找到一个python等价物。

非常感谢任何指导!

3 个答案:

答案 0 :(得分: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())

答案 1 :(得分: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进行测试

答案 2 :(得分:0)

这应该可以使用sub(正则表达式)库中的re函数。

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字符串文字在所有空格上进行贪婪匹配。