使用python正则表达式创建温度数据的JSON数组
我有一个以以下格式存储温度的日志文件:使用python正则表达式创建温度数据的JSON数组,python,regex,json,Python,Regex,Json,我有一个以以下格式存储温度的日志文件: 2013/09/30 11:23:01 Temperature 41.34F 5.19C 2013/09/30 11:23:01 Temperature 99.84F 37.69C 2013/09/30 11:23:01 Temperature 65.86F 18.81C 2013/09/30 11:25:02 Temperature 41.67F 5.38C 2013/09/30 11:25:02 Temperature 65.64F 18.69C 20
2013/09/30 11:23:01 Temperature 41.34F 5.19C
2013/09/30 11:23:01 Temperature 99.84F 37.69C
2013/09/30 11:23:01 Temperature 65.86F 18.81C
2013/09/30 11:25:02 Temperature 41.67F 5.38C
2013/09/30 11:25:02 Temperature 65.64F 18.69C
2013/09/30 11:25:02 Temperature 98.83F 37.12C
{"c":[{"v":"Date(2013, 8, 30, 11, 23)"},
给定分钟对应的数值数量可变,从1到3。如何使用Python正则表达式将数据转换为JSON格式,以便为每个时间和华氏温度值提供一系列值
{"c":[{"v":"Date(2013, 8, 30, 11, 23)"},{"v":41.34},{"v":99.84},{"v":65.86}]},
因此,脚本将打开“temperatures.log”,读取文件,获取时间值并将其转换为以下格式:
2013/09/30 11:23:01 Temperature 41.34F 5.19C
2013/09/30 11:23:01 Temperature 99.84F 37.69C
2013/09/30 11:23:01 Temperature 65.86F 18.81C
2013/09/30 11:25:02 Temperature 41.67F 5.38C
2013/09/30 11:25:02 Temperature 65.64F 18.69C
2013/09/30 11:25:02 Temperature 98.83F 37.12C
{"c":[{"v":"Date(2013, 8, 30, 11, 23)"},
(月份被-1抵消)
然后循环遍历当时的所有温度值,并包括每个类似值:
{"v":41.34},
直到找到与前一行不同的日期/时间表达式,然后使用
]},
编写输出文件,并开始下一个系列,直到日志文件结束。您不需要正则表达式,因为您的数据非常简单。首先,请注意,您甚至可以在不解析日期的情况下组织数据,因为您可以使用简单的字符串比较:
def proc_lines(lines):
cur_date = None
cur_temps = []
results = []
for line in lines:
parts = line.split()
date = "%s %s" % (parts[0], parts[1])
if date != cur_date:
if cur_temps:
#save current data
results.append((cur_date, cur_temps))
#reset state
cur_date = date
cur_temps = []
#add the line's temperature in fahrenheit, stripping out the 'F'
cur_temps.append(float(parts[3][:-1]))
#process the last line
if cur_temps:
results.append((cur_date, cur_temps))
return results
现在,结果
将是一个(日期、温度)
元组列表,其中包含未分析的日期:
>>> lines = """2013/09/30 11:23:01 Temperature 41.34F 5.19C
2013/09/30 11:23:01 Temperature 99.84F 37.69C
2013/09/30 11:23:01 Temperature 65.86F 18.81C
2013/09/30 11:25:02 Temperature 41.67F 5.38C
2013/09/30 11:25:02 Temperature 65.64F 18.69C
2013/09/30 11:25:02 Temperature 98.83F 37.12C""".split("\n")
>>> results = proc_lines(lines)
>>> results
[('2013/09/30 11:23:01', [41.340000000000003, 99.840000000000003,
65.859999999999999]),
('2013/09/30 11:25:02', [41.670000000000002, 65.640000000000001,
98.829999999999998])]
您可以使用来实际解析日期并处理日期(按要求减去月份):
请注意解析日期的格式字符串“%Y/%m/%d%H:%m:%S”
。这个可爱的内置函数使您无需编写自己的regexp来处理日期
然后您只需按如下方式处理结果并转储到json:
>>> import json
>>> def proc_result(result):
date, temps = result
res = {'c': [{'v': proc_datestr(date)}]}
for temp in temps:
res['c'].append({'v': temp})
return json.dumps(res)
>>> proc_result(results[0])
'{"c": [{"v": "Date(2013, 8, 30, 11, 23, 1)"}, {"v": 41.340000000000003}, {"v": 99.840000000000003}, {"v": 65.859999999999999}]}'
>>> proc_result(results[1])
'{"c": [{"v": "Date(2013, 8, 30, 11, 25, 2)"}, {"v": 41.670000000000002}, {"v": 65.640000000000001}, {"v": 98.829999999999998}]}'
这几乎是陈词滥调,但仍然是:“当遇到问题时,程序员会想,‘啊哈!我会使用正则表达式!’现在他有两个问题。”-正则表达式是一个非常有效的工具,但它有一个非常特殊的位置。这就像你工具箱后面的一个专用工具,除了它的一个预期用途之外,它对任何东西都毫无用处。