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 import codecs 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 poi in city_aois: 23 city_aois[poi].sort(key=lambda x: x["hot"],reverse=True) 24#item=json.dumps(city_aois[poi],ensure_ascii=False) 25 #strs = ‘{"city_name":"‘+poi.encode("UTF-8")+‘","list":‘+item.encode("UTF-8")+‘}‘ 26 #print strs 27 tmp={} 28 tmp[‘city_name‘]=poi 29 tmp[‘list‘]=city_aois[poi] 30 strs=json.dumps(tmp,ensure_ascii=False).encode("UTF-8") 31 filenew.write(strs+‘\r\n‘) 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
JSON格式數據的處理