【问题标题】:create a list of list of parameters from a file从文件创建参数列表
【发布时间】:2015-10-05 09:01:27
【问题描述】:

您好,我正在尝试从文件创建参数列表

最终的结果应该是这样的

param=[[field],[units],[height],[site]]

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

#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 用于数字值)以防某些值丢失

谢谢

【问题讨论】:

  • 也许ConfigParser 会有所帮助。
  • 所以它们的字段数不都一样?
  • 每个字段可能有单位、高度、站点。事实上我应该用 {field:[unit,height,site]} 创建一个字典

标签: python list file


【解决方案1】:

您可以使用默认字典进行分组:

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 都是以[ 开头的一行,然后我们在grouper 对象上调用next 以获取所有行到以[ 或EOF 开头的下一行:

【讨论】:

    【解决方案2】:

    这将填补缺失的信息。

    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', '']]
    

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 2013-07-27
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多