Python 笔记(一)字典与json使用及注意点
个人笔记系列,随便参考
1、python 中字典与json的差别
字典的生成
>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
Python的字典和JSON在表现形式上非常相似
Python中的一个字典 dic = { 'str': 'this is a string', 'list': [1, 2, 'a', 'b'], 'sub_dic': { 'sub_str': 'this is sub str', 'sub_list': [1, 2, 3] }, 'end': 'end' }
JSON对象 json_obj = { 'str': 'this is a string', 'arr': [1, 2, 'a', 'b'], 'sub_obj': { 'sub_str': 'this is sub str', 'sub_list': [1, 2, 3] }, 'end': 'end' }
实际上JSON就是Python字典的字符串表示,但是字典作为一个复杂对象是无法直接转换成定义它的代码的字符串
字典是一个数据的结构,而json只是一个具有一定规则的字符串,方便在不同平台上处理其中包含的数据
但本质上来讲,字典是一种数据结构,json是一种格式;字典有很多内置函数,有多种调用方法,而json是数据打包的一种格式,并不像字典具备操作性,并且是格式就会有一些形式上的限制,比如json的格式要求必须且只能使用双引号作为key或者值的边界符号,不能使用单引号,而且“key”必须使用边界符(双引号),但字典就无所谓了。
形式上的相近也让python提供了json.loads()转换函数,方便json数据的调用。
使用方法如下:
import json
a=json.loads('{"a":"1","b":"2"}')
print a
2、python 中pickle与json的差别
# 1:Json的存数据到文件:
import json
info = {
"name":"hjc",
"age":22
}
with open("a1.txt","w",encoding="utf-8") as f:
f.write(json.dumps(info)) # 注意!!!此处json存数据时会使用unicode的16进制格式,所以中文在保存文件中是\u开头的
# 当使用json.load()时会自动逆向识别,转成可读中文,大概为了不同平台的数据交流
# 若想保留中文的显示,可以添加参数ensure_ascii = False,文件中即可保留中文
# 2.Json的取数据
import json
with open("a1.txt","r",encoding="utf-8") as f:
data = json.loads(f.readline())
print(data["age"])
# 3.Pickle的存数据
import pickle
def func():
print("hello tomorrow!!!")
info = {
"name" : "hjc",
"age" : 24,
"hobby" : func
}
with open("a1.txt","wb") as f:
f.write(pickle.dumps(info))
# 4.Pickle的取数据:
import pickle
def func():
print("hello tomorrow!!!")
with open("a1.txt","rb") as f:
data = pickle.loads(f.read())
data["hobby"]()
# 5 字典直接保存为文件(不推荐)
info = {
"name" : "hjc",
"age" : 24,
"hobby" : func
}
with open("a1.txt","w") as f:
f.write(str(info)) # 能够直接保存中文,但是无法直接当作json文件来使用loads(),因为保存的是单引号,json使用双引号。
json与字典的编码问题
以下内容摘抄自Python 3中的json.dumps,会将中文转换为unicode编码后保存
先把这次踩坑的结论放在最前面
1. Python 3已经将unicode作为默认编码
2. Python 3中的json在做dumps操作时,会将中文转换成unicode编码,并以16进制方式存储,再做逆向操作时,会将unicode编码转换回中文
这就解释了,为什么json.dumps操作后,得到的字符串是\uXXXX。
------------------分割线以下部分纯属扯淡,没时间的现在可以关闭页面了-------------------------
如果不知道上面两点,加之python之前对编码处理的不好名声,就会陷入一个问题深坑中。
读到这里,如果你赶时间,就可以不用往下看了。
爆出问题的代码如下:
@app.route("/<desc>/<amount>")
def addSimpleRecord(desc, amount):
.....
file.write(json.dumps(buildJson(desc, amount)));
....
整个程序运行正常,但当我打开文件看到保存的中文数据变成了\uXXXX时,头都大了。
经过了各种尝试,我发现网上对python3中的编码问题进行了如下归纳
- \uXXXX是unicode 16进制编码的表现形式
- 在文件的第一行加上# -*- coding: utf-8 -*-
- 对字符串对象进行str.decode('...').encode('...')
- 对字符串对象进行操作:str.encode('utf-8').decode('unicode_escape')
关于第一条,print("你" == "\u4f60")得到的结果是True
关于第二条,那是python2的故事,在python3中默认的文件编码就是utf-8。因此,在保存python 3的脚本时,请务必保存为utf-8。
关于第三条,那也是python2的故事,在ptyon3中,字符串默认采用unicode编码。
关于第四条,最初我是参考 python3 把\u开头的unicode转中文,把str形态的unicode转中文,发现不能重现,后来当我用\\uXXXX时,就重现了这篇文章中描述的问题,因为\在python字符串中起转义作用(我居然给忘记了)。
为什么json.dumps处理过后的中文就变成了\uXXXX呢?原因在这里py_encode_basestring_ascii
- ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
- HAS_UTF8 = re.compile(b'[\x80-\xff]')
- ESCAPE_DCT = {
- '\\': '\\\\',
- '"''"': '\\"',
- '\b': '\\b',
- '\f': '\\f',
- '\n': '\\n',
- '\r': '\\r',
- '\t': '\\t',
- }
- def py_encode_basestring_ascii(s):
- """Return an ASCII-only JSON representation of a Python string
- """
- def replace(match):
- s = match.group(0)
- try:
- return ESCAPE_DCT[s]
- except KeyError:
- n = ord(s)
- if n < 0x10000:
- return '\\u{0:04x}'.format(n)
- #return '\\u%04x' % (n,)
- else:
- # surrogate pair
- n -= 0x10000
- s1 = 0xd800 | ((n >> 10) & 0x3ff)
- s2 = 0xdc00 | (n & 0x3ff)
- return '\\u{0:04x}\\u{1:04x}'.format(s1, s2)
- return '"' + ESCAPE_ASCII.sub(replace, s) + '"'
关键的地方就在:
return '\\u{0:04x}'.format(n)
其中{0:04x}表示取第一个参数,并取长度为4的16进制小写数字。
json.dumps的参数中有一个参数ensure_ascii,其默认值为True。我想这么做的目的可能是为了跨平台的通用性。
python3 把unicode转中文,把str形态的unicode转中文
今天用py3.5爬东西的时候,爬到的是json格式,里面的中文还都是unicode的形式.
讲道理的话只要直接输出就可以了,类似这样的
>>> print ("\u751F\u5316\u5371\u673A")
生化危机
>>>
软而坑爹的是他返回的匹配的list是这样的
['\\u751F\\u5316\\u5371\\u673A']
结果print出来事这样的
>>> print (a[0])
\u751F\u5316\u5371\u673A
>>>
python3以上取消了decode,所以你直接想st.decode(“utf-8”)的话会报str没有decode方法的错
最后贴一下解决方案
>>> print (a[0].encode('utf-8').decode('unicode_escape'))
生化危机
>>>
到此为止,python 3的编码问题总算是告一段落,如有问题,欢迎交流。
Python 笔记(一)字典与json使用及注意点的更多相关文章
- Python笔记之字典循环
Python笔记之字典循环 1.问题 Python是一门比较好入门的编程语言,但是入门简单,当然坑也是有的,今天就来介绍一个我遇到的坑吧,也是很简单的一个,就是当时脑子有点转不过弯来了. 先看代码 ...
- python笔记-7(shutil/json/pickle/shelve/xml/configparser/hashlib模块)
一.shutil模块--高级的文件.文件夹.压缩包处理模块 1.通过句柄复制内容 shutil.copyfileobj(f1,f2)对文件的复制(通过句柄fdst/fsrc复制文件内容) 源码: Le ...
- Python笔记4——字典的一些基本操作
#字典 key-value #添加 my_family= {"father": "weihaiqing", "mother": " ...
- python笔记-dict字典的方法2
#!/usr/bin/env python #-*- coding:utf-8 -*- ''' 概述: 使用键值(key-value)存储,具有极快的查找速度 注意:字典是无序的 key的特性: 1. ...
- python笔记-dict字典的方法
#!/usr/bin/env python #-*- coding:utf-8 -*- #打印0001-9999的数字 for i in range(9999): s = "%04d&quo ...
- Python笔记:字典的fromkeys方法创建的初始value同内存地址问题
dict中的fromkeys()函数可以通过一个list来创建一个用同一初始value的dict. d = dict.fromkeys(["苹果", "菠萝"] ...
- python学习笔记(18)字典和json 的区别 和转换
字典和json 的区别 和转换 前言:字典和json非常像.接下来比较一下两者的异同 先看一下字典的写法: a = {'a':'1', 'b':'2', 'c':'3' } 再看一下json的写法: ...
- Python的字典和JSON
Python的字典和JSON在表现形式上非常相似 #这是Python中的一个字典 dic = { 'str': 'this is a string', 'list': [1, 2, 'a', 'b'] ...
- Python中字符串/字典/json之间的转换
import json #定义一个字典d1,字典是无序的 d1 = { "a": None, "b": False, "c": True, ...
随机推荐
- vscode nodejs智能提示功能
1.依赖一些第三方的插件,先安装typings这个包,如果使用的是淘宝镜像,输入cnpm.cmd执行: cnpm i typings -g //cnpm install typings -global ...
- 手机中的js事件
// 手势事件 touchstart //当手指接触屏幕时触发 touchmove //当已经接触屏幕的手指开始移动后触发 touchend //当手指离开屏幕时触发 touchcancel // 触 ...
- IIS 无法显示网页问题
今天服务器上的项目突然无法访问,之前也碰到过,都是重启服务器解决的,因为重启IIS无效,另外检查发现w3wp.exe进程正常,其他端口及相关的都没什么问题,最后无奈只能想到用重启来解决了,今天又出现这 ...
- java 去除末尾的零 如果小数点可以去除同时去除小数点
String s; if(s.indexOf(".") > 0){ //正则表达 s = s.replaceAll("0+?$", "" ...
- 20155217 2016-2017-2 《Java程序设计》第4周学习总结
20155217 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 在java中,继承时使用extends关键字,private成员也会被继承,只不过子 ...
- [转]Ubuntu下ROS开发环境搭建(QT+ros_qtc_plugin)
ROS与C++入门教程-搭建开发环境(QT+ros_qtc_plugin) PS : 在“安装ros_qtc_plugin插件”这一步中,原文提到“ Ubuntu 14.04使用apt-get方式安装 ...
- Sysmon + NXlog构建简单的windows安全监控
工具: Sysmon (sysmon 5.0) ,NXlog(nxlog-ce-2.9.1716.msi) . Sysmon监控系统并生成windows event log, NXlog将wind ...
- linux可运行的shell脚本与设置开机服务启动(自己总结)
完整的ln命令参考:http://www.runoob.com/linux/linux-comm-ln.html ln :创建连接文件 - 默认创建的是硬连接,好比复制 ,但是两个文件会同步 命令:l ...
- Memcache 内存分配策略和性能(使用)状态检查【转】
前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作. ...
- mycat读写分离与主从切换【转】
什么是mycat,以及mycat的优点和特性本文不做赘述,本文继续本着实战的态度,来分享一些个人对mycat的基础功能实践.本文mycat的读写分离和主从切换的环境为mysql主从环境. 如何安装my ...