从文件中创建参数列表

时间:2015-10-05 09:01:27

标签: python list file

您好我正在尝试从文件

创建参数列表

最终结果应该是

PARAM = [[字段],[单位],[高度],[站点]]

问题是信息被分成几行,一些参数没有所有信息

#info in the file
[field1]
unit=m/s
height=70.4
site=site1
[field2]
height=20.6
site=site2
[field3]
units=m
...

所以我想以这样的方式完成所有领域,如果没有信息分配0或''

示例中的最终结果

param = {field1:'m / s',70.4,'site1',field2:'',20.6,site2,field3:'m',0,''}

我知道如何从列表列表创建字典但不设置默认值(如果缺少某些值,则字符串值为',数字值为0)

由于

2 个答案:

答案 0 :(得分:1)

您可以使用defaultdict进行分组:

from collections import defaultdict

with open("test.txt") as f:
    d = defaultdict(list)
    for line in map(str.rstrip, f):
        if line.startswith("["):
            d["fields"].append(line.strip("[]"))
        else:
            k,v = line.split("=")
            d[k].append(v)

输入:

[field1]
unit=m/s
height=70.4
site=site1
[field2]
height=20.6
site=site2
[field3]
unit=m
height=6.0
site=site3

输出:

defaultdict(<type 'list'>, {'fields': ['field1', 'field2', 'field3'], 
'site': ['site1', 'site2', 'site3'], 'unit': ['m/s', 'm'],
 'height': ['70.4', '20.6', '6.0']})

如果您确实希望按字段分组,则可以对以itertools.groupby开头的行进行[分组:

from itertools import groupby

with open("test.txt") as f:
    grps, d = groupby(map(str.rstrip,f), key=lambda x: x.startswith("[")), {}
    for k,v in grps:
        if k:
            k, v = next(v).strip("[]"), list(next(grps)[1])
            d[k] = v
    print(d)

输出:

{'field2': ['height=20.6', 'site=site2'], 
'field3': ['unit=m', 'height=6.0', 'site=site3'],
 'field1': ['unit=m/s', 'height=70.4', 'site=site1']}

每个k都是以[开头的行,然后我们在石斑鱼对象上调用下一行,将所有行连接到以[或EOF开头的下一行:< / p>

答案 1 :(得分:1)

这将填写缺失的信息。

f= open('file.txt','r')     
field, units, height, site =  [],[],[],[]
param = [ field, units, height, site]

lines = f.readlines()

i=0
while True:
    try:
        line1 = lines[i].rstrip()
        if line1.startswith('['):
            field.append(line1.strip('[]'))
        else:
            field.append(0)
            i-= 1
    except:
        field.append(0)    

    try:
        line2 = lines[i+1].rstrip()
        if line2.startswith('unit') or line2.startswith('units'):
            units.append(line2.split('=')[-1])
        else:
            units.append('')
            i-=1
    except:
        units.append('')

    try:
        line3 = lines[i+2].rstrip()
        if line3.startswith('height'):
            height.append(line3.split('=')[-1])
        else:
            height.append(0)
            i-=1
    except:
        height.append(0)    

    try:
        line4 = lines[i+3].rstrip()
        if line4.startswith('site'):
            site.append(line4.split('=')[-1])
        else:
            site.append('')                       
    except:
        site.append('')
        break

    i +=4

输出:

param: 
[['field1', 'field2', 'field3'],
 ['m/s', '', 'm'],
 ['70.4', '20.6', 0],
 ['site1', 'site2', '']]