標籤:list rank lan 大小 混合 部落格 通過 ascii byte
源檔案儲存體格式 {"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 line12 json_obj=json.loads(line)13 del json_obj["list"]14 #print json_obj15 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 strs27 tmp={}28 tmp[‘city_name‘]=poi29 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格式資料的處理