zoukankan      html  css  js  c++  java
  • JSON格式数据的处理

    源文件存储格式 {"coi_id":"dhfjhjhfjdhfjdhjs", "city_name":"深圳市", "coi_name":"海岸城", "img":"http://......jpg", "list":[{.......}], "hot":3.5},源文件JSON形式按行存储。

    目标:删除“list”属性及相关值,将相同城市名的的购物中心划在一起,最后存储为 {"city_name":"深圳市", "list":[{"coi_is":"dfgffgf", "coi_name":"海岸城", "img":"http://...jpg", "hot":3.5}, {...}, ...] }形式,并对每个城市下的购物中心的热度hot按值大小排序。

    实现:

     1 import json
     2  3 
     4 fileread=open("test.data")
     5 filenew=open("aois.txt",'w+')
     6 
     7 city_aois={}
     8 city_put={}
     9 
    10 for line in fileread:
    11     #print line
    12     json_obj=json.loads(line)
    13     del json_obj["list"]
    14     #print json_obj
    15     if json_obj['city_name'] not in city_aois:
    16         city_aois[json_obj['city_name']]=[]
    17         city_aois[json_obj['city_name']].append(json_obj)
    18     else:
    19         city_aois[json_obj['city_name']].append(json_obj)
    20 
    21 
    22 for p in city_aois:
    23     city_aois[p].sort(key=lambda x: x["hot"],reverse=True)
    24     #item=json.dumps(city_aois[p],ensure_ascii=False)
    25     #strs = '{"city_name":"'+p.encode("UTF-8")+'","list":'+item.encode("UTF-8")+'}'
    26     #print strs
    27     tmp={}
    28     tmp['city_name']=p
    29     tmp['list']=city_aois[p]
    30     strs=json.dumps(tmp,ensure_ascii=False).encode("UTF-8")
    31     filenew.write(strs+'
    ')
    32 
    33 fileread.close()
    34 filenew.close()

    踩过的坑:

    1. 对python不熟,其实“JSON”并不是java中使用的是一个对象,仅仅是JSON格式的字符串,通过json.loads()是将读取文件的字符串转换为“字典”形式,类型为 “dict”,然后就可以对字典进行相应的操作了,譬如根据key获得value这样的形式。

    2. python将JSON格式的字符串转为字典时,此时是unicode编码,一系列操作完毕后,需要通过json.dumps()将字典转换为字符串,这时候会出现各种编码问题,譬如简单dumps后中文显示的是unicode形式,如果字典里有中文,则需要加上

    json.dumps(tmp,ensure_ascii=False)

    打印显示时,还需调用encode将编码转换为UTF-8形式。

    3. 会出现错误“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 1: ordinal not in range(128)”

     是因为“key和value不能以混合普通字符串和unicode字符串的形式存在”.

     此外,

    item=json.dumps(city_aois[poi],ensure_ascii=False)
    tmp['list']=item.encode("UTF-8")
    strs=json.dumps(tmp,ensure_ascii=False).encode("UTF-8")
    print strs

    如上做法就是先将 dict转换为字符串复制给了tmp的“list”, 然后dumps时就不会以字典的规矩馆list中的内容,一律以字符串对待,则会出现:

    所以在dumps前,list中的内容也要是字典形式。最后统一dumps。 

    注意使用过程中,编码一致性

    参考了以下博客内容:

    json.dumps使用的坑以及字符编码:

    http://www.cnblogs.com/stubborn412/p/3818423.html

    在线查看 不同编码内容对应的汉字:

    http://tool.oschina.net/encode?type=3

    python字典与文件读写:

    http://blog.csdn.net/frankchen0130/article/details/53136681

    json.dumps编码 utf8与unicode:

    https://stackoverflow.com/questions/18337407/saving-utf-8-texts-in-json-dumps-as-utf8-not-as-u-escape-sequence

  • 相关阅读:
    网页返回码大全
    求数组中子数组的最大和
    什么是面向对象?面向对象与面向过程的区别?
    Java内部类
    Java拆箱装箱
    linux中su和sudo区别
    Linux 中账户管理
    解决warn appiumdoctor bin directory for $java_home is not set
    Moco之include
    Mock server 之 Moco的使用
  • 原文地址:https://www.cnblogs.com/yiruparadise/p/7225717.html
Copyright © 2011-2022 走看看