Python json unicode转中文
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python json unicode转中文相关的知识,希望对你有一定的参考价值。
try:
ajax=json.loads(html,encoding='utf-8') #HTML为解析后的JSON格式
for i in range(len(ajax)):
result = []
result_gbk=[]
for field in fields:
result.append(ajax[i][field])
result_gbk = json.dumps(result, ensure_ascii=False)
结果:
result:[[u'9.6', u'50'], 1, True, u'1292052', [u'\u72af\u7f6a', u'\u5267\u60c5'], [u'\u7f8e\u56fd'], u'\u8096\u7533\u514b\u7684\u6551\u8d4e', ', u'1994-09-10', 15, 725531, u'9.6']
怎样将其转成中文并存储为.csv格式?
reload(sys)
sys.setdefaultencoding( "utf-8" )
result = [[u'9.6', u'50'], 1, True, u'1292052', [u'\\u72af\\u7f6a', u'\\u5267\\u60c5'], [u'\\u7f8e\\u56fd'], u'\\u8096\\u7533\\u514b\\u7684\\u6551\\u8d4e', u'1994-09-10', 15, 725531, u'9.6']
f = open('data.csv','w')
for i in result:
if type(i) is list:
for j in i:
if type(j) == int or type(j) == float or type(j) == bool:
j = str(j) + ','
else:
j = j.encode('gbk') + ','
print j,
print >> f, j,
else:
if type(i) == int or type(i) == float or type(i) == bool:
i = str(i) + ','
else:
i = i.encode('gbk') + ','
print i,
print >> f, i,
f.close()
python json unicode utf-8处理总结
1.直接输出字典中文
在python中经常遇见直接print dict(字典),或者dict转json,但是没有给特定的参数,然后打印json字符串,输出的中文就成了unicode码的情况,如下:
d = ‘name‘: ‘张三‘, ‘age‘: ‘1‘
print d
jd = json.dumps(d)
print jd
输出结果为:
‘age‘: ‘1‘, ‘name‘: ‘\xe5\xbc\xa0\xe4\xb8\x89‘
"age": "1", "name": "\u5f20\u4e09"
这种情况怎么办呢?
要将字典中的中文正确的输出,可以将d转换成json字符串,转换时使用json.dumps(d, ensure_ascii=False, encoding=‘utf-8‘))
d = ‘name‘: ‘张三‘, ‘age‘: ‘1‘
print d
jd = json.dumps(d, ensure_ascii=False, encoding=‘utf-8‘))
print jd
输出结果为:
‘age‘: ‘1‘, ‘name‘: ‘\xe5\xbc\xa0\xe4\xb8\x89‘
"age": "1", "name": "张三"
参数ensure_ascii=False不能少, encoding可以省略,因为默认就是encoding=‘utf-8‘
关于参数ensure_ascii的解释:
If ``ensure_ascii`` is true (the default), all non-ASCII characters in the
output are escaped with ``\uXXXX`` sequences, and the result is a ``str``
instance consisting of ASCII characters only. If ``ensure_ascii`` is
``False``, some chunks written to ``fp`` may be ``unicode`` instances.
This usually happens because the input contains unicode strings or the
``encoding`` parameter is used. Unless ``fp.write()`` explicitly
understands ``unicode`` (as in ``codecs.getwriter``) this is likely to
cause an error.
关于参数encoding的解释:
``encoding`` is the character encoding for str instances, default is UTF-8.
2.用python自带的json库将json转换成字典输出,输出是unicode码
在用json.loads(json_str)将json_str字符串转换成字典时,字典中的内容是unicode码,具体如下:
ud = json.loads(jd, encoding=‘utf-8‘)
print ud
输出结果:
u‘age‘: u‘1‘, u‘name‘: u‘\u5f20\u4e09‘
字典中的字符串都带的u,要想去掉u,有两种办法
a.使用yaml库的yaml.safe_load(jd)
import yaml
d = ‘name‘: ‘张三‘, ‘age‘: ‘1‘
print d
jd = json.dumps(d, ensure_ascii=False, encoding=‘utf-8‘))
ud = json.loads(jd, encoding=‘utf-8‘)
print ud
ud = yaml.safe_load(jd, encoding=‘utf-8‘)
print ud
结果输出为:
u‘age‘: u‘1‘, u‘name‘: u‘\u5f20\u946b‘
‘age‘: ‘1‘, ‘name‘: u‘\u5f20\u946b‘
视觉明锐的同学可能发现第二个name的值前还是有u,也就是说他是unicode码。的确是的,上面的第1点已经说明了,直接打印字典,字典里面的中文就是乱码的,但是为什么是unicode码,需要更深一步分析,也希望知道的朋友不吝留言告知,谢谢。
b 递归实现转码函数自己去将json.loads()返回的字典从unicode码转成自己想要的码,实现如下:
def byteify(input, encoding=‘utf-8‘):
if isinstance(input, dict):
return byteify(key): byteify(value) for key, value in input.iteritems()
elif isinstance(input, list):
return [byteify(element) for element in input]
elif isinstance(input, unicode):
return input.encode(encoding)
else:
return input
使用示例:
d = ‘name‘: ‘张三‘, ‘age‘: ‘1‘
print d
jd = json.dumps(d, ensure_ascii=False, encoding=‘utf-8‘))
ud = json.loads(jd, encoding=‘utf-8‘)
print ud
ud = byteify(ud)
print ud
print ud[‘name‘]
输出结果如下:
u‘age‘: u‘1‘, u‘name‘: u‘\u5f20\u946b‘
‘age‘: ‘1‘, ‘name‘: ‘\xe5\xbc\xa0\xe9\x91\xab‘
张三
这次是彻底的将json.loads()返回的字典转换码成了utf-8,至于输出为什么是乱码?别忘了,开头第一点说的,直接print字典,中文是会乱码的,但是print ud[‘name‘] 就会正常显示中文‘张三‘。
参考来源:https://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of-unicode-from-json
作者:llicety
链接:https://www.jianshu.com/p/90ecc5987a18
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
以上是关于Python json unicode转中文的主要内容,如果未能解决你的问题,请参考以下文章