我必须通过阅读文件来创建字典
信息分为行
键位于括号之间,但并非所有键都是键。只是[日期]之后的那些
两个键之间的是分成行的值,但并非所有行都是可选值
最终结果应该是
d = [键:[单位,高度,现场]]
某些键没有所有值。然后,如果不存在单位,高度或位置,则应使用''或0
来满足该值index(offset)
示例中的最终结果
param = {AX1:['m / s',70.4,'site1'],H4:['',20.6,'site2'],V3:['m',0,'']}
我知道如何从列表列表创建字典但不设置默认值(如果缺少某些值,则字符串值为',数字值为0)
我尝试使用Collections中的defaultdict,但我还不熟悉这个类,可能我没有使用它的所有可能性
感谢您的帮助
答案 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, '']}