原文关于读取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 = Falseelse:header = Truef = codecs.open(out_file, 'a', 'gbk')dictWriter = csv.DictWriter(f, list(d.keys()))# only write header when create a new csvif 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 OKwhile (url_file.getcode() != 200):raise Exception('Server connection error, status code:' + ' ')# request again after 3mintime.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.txtf = 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格式的气象数据相关推荐

  1. arcgis风向_ArcGIS10.2读取NetCDF格式的气象数据含风向

    ArcGIS读取NetCDF格式的气象数据 尝试使用Make netCDF File的Tool 参数设置: 变量:PM2_5DRY X维度:XLONG Y维度:XLAT Dimension:南北+东西 ...

  2. python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

    1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...

  3. ajax读取文件数据,Ajax 实现读取 properties 格式资源文件数据

    Ajax 的核心是 JavaScript 对象 XmlHttpRequest.该对象在 Internet Explorer 5 中首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpRequ ...

  4. 将数据写入json文件,并且读取json文件中的数据

    目录 一.将数据生成json文件 二.读取json文件中的数据 三.方法测试 四.其他附件 1.User实体类 2.import 一.将数据生成json文件 方法 /*** 生成.json格式文件*/ ...

  5. MATLAB读取HDF格式的SST数据

    利用MATLAB读取HDF格式的SST数据是比较简单的,MATLAB中有专门用于读取HDF的函数hdfread()与hdfinfo()就能很好的读取HDF文件.我们可以在读取文件的时候,通过显示文件中 ...

  6. python读取json格式的超参数

    python读取json格式的超参数 json文件: {"full_finetuning": true,"max_len": 180,"learnin ...

  7. MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据

    MariaDB 10.0.X中,动态列(Dynamic Columns),可以支持 JSON 格式来获取数据. 为了兼容传统SQL语法,MariaDB 10和MySQL5.7支持原生JSON格式,即关 ...

  8. 读取json格式的图片、文字并保存成图片

    读取json格式的图片.文字并保存成图片 说明 从数据库中获取到图片.中文.英文信息后,将其合成json文件,图片格式为base64格式,需要将其转成二进制形式,然后将其保存成图片,将中文.英文信息保 ...

  9. Python 将JSON格式文件进行数据可视化制作世界人口地图

    (一) 制作世界人口地图:JSON格式 下载JSON格式的人口数据,并使用json模块来处理它,Pygal提供一个适合初学者使用的地图创建工具,使用它来对人口数据进行可视化,用来探索全球人口的分布情况 ...

最新文章

  1. .Net Core Nuget还原失败
  2. 深度学习-超参数调优
  3. c语言教程苏小红,《数据结构(C语言)》苏小红 课本案例
  4. C++_基础部分_C++文件操作_文件的写入操作---C++语言工作笔记076
  5. contenteditable获得焦点后的边框设置
  6. 尚硅谷大数据—搭建Hadoop集群—硬件环境准备
  7. 【开源】EasyDarwin编译全过程:Linux系统下编译运行最新版EasyDarwin的步骤介绍
  8. 报名 | AI产品经理闭门会_第13期_北京_4场主题分享_本周六(2月19日)
  9. 台式计算机有hdmi口,我的台式电脑没有hdmi接口怎么解决
  10. android ios 录音功能,iOS与Android的音频互通
  11. 有道计算机网络知识,网易有道推广介绍1 让你了解到网易的知识。。。.pptx
  12. 万字长文!推荐一款日志切割神器
  13. 动态拨号vps有什么作用?
  14. postgresql 数据库中 like 、ilike、~~、~~*、~、~*的含义
  15. 转阿彪 PHP常见的安全问题
  16. 阿里云配置服务器,短信,域名
  17. Unity资源管理(四)-AssetBundle使用模式
  18. 手写实现数据库连接池
  19. POV系列制作之十字旋转LED
  20. SVG 入门指南(看完,对SVG结构不在陌生)

热门文章

  1. linux 多网卡多路由表实现策略路由
  2. ARP 协议 理解
  3. 在Linux使用exec执行命令时报的哪些错
  4. 衡量视频序列特性的TI(时间信息)和SI(空间信息)
  5. 华为交换机STP的配置实例
  6. Blueprint:一个让你获取示例代码的Flash Builder扩展
  7. ios 仿微信,短信聊天气泡
  8. 唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题
  9. Git学习系列(一)初识Git
  10. JBoss 系列三十七:jBPM5示例之 Rule Task