python读取JSON数据,并解决字符集不匹配问题

本文介绍了一个简单的Python脚本,该脚本能够从指定的URL获取JSON格式的天气数据,解析所需信息,并将其保存到本地文件中。文章还提供了解决Unicode字符编码问题的方法。
转自:http://blog.csdn.net/marksinoberg/article/details/51471812


今天来谈一谈Python解析JSON数据,并写入到本地文件的一个小例子。

思路如下

从一个返回JSON天气数据的网站获取到目标JSON数据串
使用Python解析出需要的部分
写入到本地文件,供其他的应用程序读取

完成整个业务需求


原料


一个可以获得天气信息的URL网址,如天气信息接口 (http://www.weather.com.cn/data/sk/101010100.html)
读取到的结果:(由于是浏览器显示的时候的编码与之不匹配,故出现了乱码,但这并不影响我们对数据的处理)
返回json如下:
{
"weatherinfo": {
"city": "鍖椾含",
"cityid": "101010100",
"temp": "18",
"WD": "涓滃崡椋�",
"WS": "1绾�",
"SD": "17%",
"WSE": "1",
"time": "17:05",
"isRadar": "1",
"Radar": "JC_RADAR_AZ9010_JB",
"njd": "鏆傛棤瀹炲喌",
"qy": "1011",
"rain": "0"
}
}


代码如下:

#coding:utf-8

'''
用于解析接口返回的json数据,并将数据打印保存到记事本文件
'''

import os
import urllib,urllib2
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

# 获取到目标URL的JSON数据串
def getHtml(url):
    page = urllib2.urlopen(url)
    html = page.read()
    return html

def getValueDict(data):
    data = json.loads(data)
    content = data['weatherinfo']
    return content

def parseTOUTF8(data):
    result = json.dumps(data,ensure_ascii=False)
    return result

def prettyData(data):
    result = 'My Weather Info :\n'
    for item in data:
        result = result + item + '\t' + parseTOUTF8(data[item]) + '\n'
    return result


def writeToLocal(filepath,filename,data):
#    file = os.open(filepath+filename,'wb')
    file = open(os.path.join(filepath,filename),'w')
    file.write(data)
    file.close()
    print '数据已经成功写入到本地文件'

if __name__ == "__main__":
    url = 'http://www.weather.com.cn/data/sk/101010100.html'
    page = getHtml(url)
    text = getValueDict(page)
    content = prettyData(text)
    print content
    path='F:'
    writeToLocal(path,'MyWeatherInfo.txt',content)
    print '天气信息获取并更新完毕'

其中遇到问题,报错如下:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 24-25: ordinal not in range(128)


解决方法如下:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

参考自文章:

http://wangye.org/blog/archives/629/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值