zoukankan      html  css  js  c++  java
  • 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:Python33all_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:Python33all_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:Python3311.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() + '
    '
            print(error)
            print('
    ')
            f = codecs.open('error.log', 'a', 'utf-8')
            f.writelines(error)
            f.close()
            os.system('pause')
  • 相关阅读:
    工单组件增强
    一些BAPI
    实例程序
    使用BAPI一定要提交和回滚(错误)
    动态内表值导出为TXT文件
    网页常用功能
    Code Complete
    Typescript 解构 、展开
    Typescript变量声明
    TypeScript基础数据类型
  • 原文地址:https://www.cnblogs.com/arxive/p/6193444.html
Copyright © 2011-2022 走看看