使用Python解析Shell文件输出

4

我有一个包含数据的文件。该文件是从shell脚本文件生成的输出:

|a                     |869         |
|b                     |835         |
|c                     |0           |
|d                     |0           |
|e                     |34          |
|f                     |3337     

我该如何从中得到a = 869?

更好的标题:如何在Python中读取(或解析)列式数据文件? - sastanin
4个回答

9
你可以这样做:
output = {}
for line in open("myfile"):
    parts = line.split('|')
    output[parts[1].strip()] = parts[2].strip()

print output['a'] // prints 869
print output['f'] // prints 3337

或者,如Eugene Morozov所建议的那样,使用csv模块:

import csv
output = {}
reader = csv.reader(open("C:/output.txt"), delimiter='|')
for line in reader:
    output[line[1].strip()] = line[2].strip()

print output['a'] // prints 869
print output['f'] // prints 3337

我认为最好从一对列表中构建一个字典。这样只需要一行代码,并且可以使用列表推导式完成。请参见https://dev59.com/A0fRa4cB1Zd3GeqP7Tkx#751613 - sastanin
个人而言,我不太喜欢用一行代码解决所有问题。也许是因为我刚接触 Python,但列表推导式对我来说并没有像其他人那样“美丽动人”。 - Paolo Bergantino
当然,这是个人口味问题。我认为这样更清晰和本地化(我不必关心字典是否为空)。 - sastanin

4
lines =  file("test.txt").readlines()
d = dict([[i.strip() for i in l.split("|")[1:3]] for l in lines if l.strip()])

例如:

>>> lines =  file("test.txt").readlines()
>>> d = dict([[i.strip() for i in l.split("|")[1:3]] for l in lines if l.strip()])
>>> d['a']
'869'

3

您也可以使用带有分隔符|csv模块。


0

也许不是最符合Python风格的方法,但如果您的shell输出存储在f.txt中,并且您正在寻找每一行进行处理,则应该可以使用此方法:

h = open("f.txt", "rt")
inp = h.readline()
while inp:
  flds = inp.split('|')
  str = flds[1].strip() + " = " + flds[2].strip()
  print str
  inp = h.readline()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接