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')
复制代码

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



   本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6193444.html ,如需转载请自行联系原作者


相关文章
|
1月前
|
存储 JSON Apache
揭秘 Variant 数据类型:灵活应对半结构化数据,JSON查询提速超 8 倍,存储空间节省 65%
在最新发布的阿里云数据库 SelectDB 的内核 Apache Doris 2.1 新版本中,我们引入了全新的数据类型 Variant,对半结构化数据分析能力进行了全面增强。无需提前在表结构中定义具体的列,彻底改变了 Doris 过去基于 String、JSONB 等行存类型的存储和查询方式。
揭秘 Variant 数据类型:灵活应对半结构化数据,JSON查询提速超 8 倍,存储空间节省 65%
|
5天前
|
存储 JSON NoSQL
MongoDB的文档存储格式BSON和JSON的区别
MongoDB的文档存储格式BSON和JSON的区别
|
7天前
|
存储 JSON JavaScript
「Python系列」Python JSON数据解析
在Python中解析JSON数据通常使用`json`模块。`json`模块提供了将JSON格式的数据转换为Python对象(如列表、字典等)以及将Python对象转换为JSON格式的数据的方法。
24 0
|
11天前
|
存储 JSON 数据挖掘
python逐行读取txt文本中的json数据,并进行处理
Python代码示例演示了如何读取txt文件中的JSON数据并处理。首先,逐行打开文件,然后使用`json.loads()`解析每一行。接着,处理JSON数据,如打印特定字段`name`。异常处理包括捕获`JSONDecodeError`和`KeyError`,确保数据有效性和字段完整性。将`data.txt`替换为实际文件路径运行示例。
11 2
|
16天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
29天前
|
JSON 数据格式
糊涂工具类(hutool)post请求设置body参数为json数据
糊涂工具类(hutool)post请求设置body参数为json数据
19 1
|
30天前
|
JSON 前端开发 数据格式
Ajax传递json数据
Ajax传递json数据
11 0
|
1月前
|
JSON 并行计算 API
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
81 0
|
1月前
|
JSON 数据格式 Python
Python生成JSON数据
Python生成JSON数据
22 0
|
1月前
|
JSON 数据可视化 Linux
数据可视化工具JSON Crack结合内网穿透实现公网访问
数据可视化工具JSON Crack结合内网穿透实现公网访问
数据可视化工具JSON Crack结合内网穿透实现公网访问