pyhton读取json格式的气象数据
原文关于读取pm25.in气象数据的pyhton方法,以及浅析python json的应用
以pm25.in网站数据为例。
1、方法介绍
首先感谢pm25.in提供了优质的空气污染数据,为他们的辛勤劳动点个赞。是python3.3,windows系统,读取数据的时候用到了python的json处理的4个方法,很经典常用。所谓4个方法是:
a) json.loads()
输入string,返回json。
b) json.dumps()
输入json类型的数据,返回包含json数据的string,可以这样用的好处是可以进行按key字典排序,json.dumps( json_res, sort_keys=True).
c) json.load()
输入类文件对象,返回json对象,
json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
d) json.dump()
输入json对象,用法:
json.dump(obj,fp,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None, indent=None, separators=None,default=None,sort_keys=False, **kw),obj是json对象,fp是要保存的文件。
说明:
包含utf-8编码的html在被windows系统下保存时,会在文件头有BOM,ultraedit编辑器十六进制看到开头是EF BB BF,这个事情很捣乱,导致读取json数据文件时报错,解决办法是:data_file = open(r'c:\Python33\all_data',encoding='utf_8_sig').read()
加上encoding='utf_8_sig',否则一个json数据开头为BOM标记,整个程序无法识别。
还有要注意,整个传递值的时候,必须统一用utf-8编码,一但不用会产生很多混乱,开始没有注意耽误了不少时间。如
# 请求数据
def requestData( data_file):
# 输入str,返回json数据
json_res = json.loads(data_file, encoding='utf-8')
# 输入json,返回str,目的是排序
encodedjson = json.dumps(json_res, sort_keys=True)
# 输入str,返回json,务必要以utf-8加载json数据
decodejson = json.loads(encodedjson, encoding='utf-8')
return decodejson
2、json数据的分类
json数据分为两类:
一个是对象,如{'a':1,'b':2},或者{'c':3,'d':4},对应python里的dict
一个是json数组,[{'a':1,'b':2},{'c':3,'d':4}],相当于2维数组,相当于python的一个list,dict里的对象的位置是随机的,要想用固定顺序需要用dict = collections.OrderedDict(),如本来是{'a':1,'b':2},普通dict输出可能是{'b':2,'a':1},只有OrderDict才是保证{'a':1,'b':2}这样的输出。
3、pyhton的excel处理
codecs.open(out_file, 'a', 'gbk')
dictWriter = csv.DictWriter(f, list(d.keys()))
dictWriter.writeheader()是写excel文件的列名,只写一次, dictWriter.writerow(d)是按行写数据。
PS: 如果想要加入crontab 需要在文件头加#!/usr/bin/python,否则不行。
4、实现
下面全部程序:
# 请求数据
def requestData(data_file):
# 输入str,返回json数据
json_res = json.loads(data_file, encoding='utf-8') # 输入json,返回str,目的是排序
encodedjson = json.dumps(json_res, sort_keys=True) # 输入str,返回json,务必要以utf-8加载json数据
decodejson = json.loads(encodedjson, encoding='utf-8') return decodejson # 输出数据
def out_data(out_file, d):
if not os.path.exists(out_file):
print(out_file)
header = False
else:
header = True
f = codecs.open(out_file, 'a', 'gbk')
dictWriter = csv.DictWriter(f, list(d.keys()))
# only write header when create a new csv
if not header:
dictWriter.writeheader() dictWriter.writerow(d) f.close() # 主程序
if __name__ == '__main__': # data_file = open(r'c:\Python33\all_data',encoding='utf_8_sig').read()
nowstrp = time.localtime()
out_file = time.strftime('%Y%m%d', nowstrp) + '.csv'
d = collections.OrderedDict() headers = {'User-Agent': 'Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)'}
chaper_url = 'http://www.pm25.in/api/querys/all_cities.json?token=appkey(appkey自己去申请,5工作日给答复)'
# ie9:Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)
# 创建request请求
url_request = urllib.request.Request(chaper_url, data=None, headers=headers)
# 打开网址
url_file = urllib.request.urlopen(url_request) if (url_file.getcode() == 200): chaper_url = 'http://www.pm25.in/api/querys/all_cities.json?token=appkey'
else:
chaper_url = 'http://www.pm25.in/api/querys/all_cities.json?token=appkey' try:
print(chaper_url) headers = {'User-Agent': 'Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)'} # ie9:Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)
# 创建request请求
url_request = urllib.request.Request(chaper_url, data=None, headers=headers)
# 打开网址
url_file = urllib.request.urlopen(url_request)
data_file = url_file.read().decode('utf-8') # status code: 200 OK
while (url_file.getcode() != 200):
raise Exception('Server connection error, status code:' + ' ')
# request again after 3min
time.sleep(3 * 60) headers = {'User-Agent': 'Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)'} # ie9:Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0) url_request = urllib.request.Request(chaper_url, data=None, headers=headers) url_file = urllib.request.urlopen(url_request)
data_file = url_file.read().decode('utf-8')
# 返回数据为json格式
# json_res = data_file.read().decode('utf-8') decodejson = requestData(data_file)
# 存储json天气数据为data_json.txt
f = open('data_json.txt', 'w', encoding='utf-8')
json.dump(decodejson, f)
f.close()
# 下面一句是当数据文件为本机的文件时,才用到的必须加utf_8_sig
# data_final=open(r'c:\Python33\11.txt',encoding='utf_8_sig').read() for element in decodejson:
print(element)
d['area'] = element['area']
d['position_name'] = element['position_name']
d['aqi'] = element['aqi']
d['co'] = element['co']
d['co_24h'] = element['co_24h']
d['no2'] = element['no2']
d['no2_24h'] = element['no2_24h']
d['o3'] = element['o3']
d['o3_24h'] = element['o3_24h']
d['o3_8h'] = element['o3_8h']
d['o3_8h_24h'] = element['o3_8h_24h']
d['pm10'] = element['pm10']
d['pm10_24h'] = element['pm10_24h']
d['pm2_5'] = element['pm2_5']
d['pm2_5_24h'] = element['pm2_5_24h']
d['primary_pollutant'] = element['primary_pollutant']
d['quality'] = element['quality']
d['so2'] = element['so2']
d['so2_24h'] = element['so2_24h']
d['station_code'] = element['station_code']
d['time_point'] = element['time_point'] # 逐行写excel文件
out_data(out_file, d) # os.system('pause')
# time.sleep(180) except Exception as e:
error = traceback.format_exc() + '\r\n'
print(error)
print('\r\n')
f = codecs.open('error.log', 'a', 'utf-8')
f.writelines(error)
f.close()
os.system('pause')
pyhton读取json格式的气象数据的更多相关文章
- Android读取JSON格式数据
Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...
- struts2使用jsp和<s:property>标签获取json格式的返回数据
struts2使用jsp和<s:property>标签获取json格式的返回数据 1.struts2的action中 return "success"; 2.指向的返回 ...
- .net core读取json格式的配置文件
在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用j ...
- 接口自动化(三)--读取json文件中的数据
上篇讲到实际的请求数据放置在json文件内,这一部分记述一下python读取json文件的实现. 代码如下(代码做了简化,根据需要调优:可做一些容错处理): 1 import json 2 3 cla ...
- spring mvc接收参数方式,json格式返回请求数据
1 使用方法形参使用变量接收提交的数据 2 在方法的形参中使用模型接收数据 3 如果在提交的表单中有多个数据模型,需要创建一个新的Bean,里面的属性是要接收的对象变量. 4 接收提交的日期字符串,转 ...
- Ajax实现异步操作实例_针对JSON格式的请求数据
最近写了一篇ajax异步操作XML格式的,今天就写关于json格式的. 一.简单了解Json 1. JSON有两种表示结构,对象和数组. 1.1 对象: { key1:value1, key2:val ...
- Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07
目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...
- ajax发送json格式与文件数据、django自带的序列化器(了解)
上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...
- perl 读取json 格式的文件
使用JSON 模块中的 decode_json 函数,将json文件中的数据解码为perl 中的对象,然后进行处理 代码如下: #!/usr/bin/env perl use JSON; use En ...
随机推荐
- MySql数据类型(转)
数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指 ...
- NOI 银河英雄传说
并查集水题,记录祖先,大小和深度即可,每次用祖先的大小和深度更新后代的深度. #include <cstdio> #include <iostream> #include &l ...
- C语言二重指针与malloc
(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...
- 论文阅读之 DECOLOR: Moving Object Detection by Detecting Contiguous Outliers in the Low-Rank Representation
DECOLOR: Moving Object Detection by Detecting Contiguous Outliers in the Low-Rank Representation Xia ...
- Lua5.1基本函数库介绍
Lua5.1基本函数库介绍assert (v [, message])功能:相当于C的断言,参数:v:当表达式v为nil或false将触发错误,message:发生错误时返回的信息,默认为" ...
- Linux进程间通信-信号
1.什么是信号信号是Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作. 2.信号的产生1)由硬件产生,如从键盘输入Ctrl+C可以终止当前进程2)由其他进程发送,如可在s ...
- jQuery根据文本设置select选中失效问题
$("#select_id option[text='jQuery']").attr("selected", true) 失效 text是Jquery关键字,不 ...
- USACO/gift1
描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人. 然而,在任何一群朋友中 ...
- java中的堆、栈、常量池以及String类型的两种声明
参考自http://blog.sina.com.cn/s/blog_798b04f90100ta67.html http://www.cnblogs.com/fguozhu/articles/2661 ...
- [mybatis] mybatis错误:Invalid bound statement (not found)
点击菜单抛出异常: org.springframework.web.util.NestedServletException: Request processing failed; nested exc ...