通过使用默认值读取文件来创建字典

时间:2015-10-09 06:52:46

标签: python file dictionary collections

我必须通过阅读文件来创建字典

信息分为行

键位于括号之间,但并非所有键都是键。只是[日期]之后的那些

两个键之间的

是分成行的值,但并非所有行都是可选值

最终结果应该是

d = [键:[单位,高度,现场]]

某些键没有所有值。然后,如果不存在单位,高度或位置,则应使用''或0

来满足该值
index(offset)

示例中的最终结果

param = {AX1:['m / s',70.4,'site1'],H4:['',20.6,'site2'],V3:['m',0,'']}

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

我尝试使用Collections中的defaultdict,但我还不熟悉这个类,可能我没有使用它的所有可能性

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

这可以使用Python ConfigParser完成,如下所示:

L.FeatureGroup

给你输出:

// Empty featuregroup
var featureGroup = new L.FeatureGroup().addTo(map);

// Add some features to featuregroup
var polyline1 = new L.Polyline([
    [52.366667, 4.9],
    [51.507222, -0.1275]
]).addTo(featureGroup);

var polyline2 = new L.Polyline([
    [52.366667, 4.9],
    [48.8567, 2.3508]
]).addTo(featureGroup);

var polyline3 = new L.Polyline([
    [52.366667, 4.9],
    [52.516667, 13.383333]
]).addTo(featureGroup);

// Get bounds of featuregroup
var bounds = featureGroup.getBounds();

// Set view to bounds
map.fitBounds(bounds);

// Restrict view to bounds
map.setMaxBounds(bounds);

此外,在找到第一部分之前,不会解析文件中的行,即以import ConfigParser from itertools import dropwhile import io config = ConfigParser.ConfigParser({'unit' : '', 'units' : '', 'height' : 0, 'site' : ''}) skip = [] # Skip over lines until the first section is found with open('input.txt', 'r') as f_input: for line in dropwhile(lambda x: not x.startswith('['), f_input): skip.append(line) config.readfp(io.BytesIO('\n'.join(skip))) # Remove sections which are not required for remove in ['Summary', 'System', 'date']: config.remove_section(remove) param = {} for section in config.sections(): param[section] = [ config.get(section, 'unit') + config.get(section, 'units'), config.getfloat(section, 'height'), config.get(section, 'site')] print param 开头的行。

答案 1 :(得分:0)

在确定密钥开始的点之后,这应该为您提供有关如何解析文件其余部分的必要建议:

defaults = {'units':'', 'height':0, 'site':''}

with open(<file>) as f:
    <skip first section to date>

    param = {}
    d = {}
    tag = ""
    for line in f:
        if line[0] == '[':
            if tag:
                param[tag] = [d.get(k, defaults[k]) for k in ['units', 'height', 'site']]
            tag = line[1:-2]
            d = {}
            continue
        k,v = line.rstrip().split('=')
        d[k] = v
    else:
        param[tag] = [d.get(k, defaults[k]) for k in ['units', 'height', 'site']]
param

输出(在unit中将units更改为'AX1'):

{'AX1': ['m/s', '70.4', 'site1'],
 'H4': ['', '20.6', 'site2'],
 'V3': ['m', 0, '']}

更新:我非常喜欢使用configparser [py3](ConfigParser [py2])的@MartinEvans方法,但相信它可以更简单:

from configparser import ConfigParser
#from ConfigParser import ConfigParser  [py2]

with open(<file>) as f:
    <skip first section to date>

    config = ConfigParser()
    config['DEFAULT'] = {'units':'', 'height':0, 'site':''}
    config.read_file(f)
    # config.readfp(f)  [py2]
    for section in config.sections():
        param[section] = [config.get(section, k) for k in ['units', 'height', 'site']]
param

<强>输出:

{'AX1': ['m/s', '70.4', 'site1'],
 'H4': ['', '20.6', 'site2'],
 'V3': ['m', 0, '']}