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, ...
随机推荐
- A Gentle Guide to Machine Learning
A Gentle Guide to Machine Learning Machine Learning is a subfield within Artificial Intelligence tha ...
- React - 环境准备
1. 下载 node.js,在 https://nodejs.org/en/download/ 选择合适的版本. 2. 检查 node.js 是否安装成功. hueyMB:~ zhisenzheng$ ...
- git push时报错fatal: Could not read from remote repository.
后来发现,出现这个问题是因为仓库地址不对 使用如下命令先查看一下: $ git remote -v 发现跟github的地址不一致 然后在终端输入:git remote set-url origin ...
- python核心编程笔记——Chapter8
Chapter8.条件和循环 这一章感觉有用的点并不多,在我眼里就只有迭代器,列表解析和生成器表达式值得研究而已. 8.2.循环,难度不大. #!usr/bin/env python #-*-codi ...
- 【Foreign】动态规划 [分治][DP]
动态规划 Time Limit: 50 Sec Memory Limit: 128 MB Description 一开始有n个数,一段区间的价值为这段区间相同的数的对数. 我们想把这n个数切成恰好k ...
- Dynamic Rankings(动态第k大+树套树)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题目: 思路: 树套树板子题. 代码实现如下: #inclu ...
- pandas 对时间与日期处理
1.先把字符串时间转为时间类型: def func(x): y =pd.Timestamp(x) return y data.index = data.发博时间.apply(lambda x : fu ...
- UNIX网络编程 第6章 I/O复用:select和poll函数
UNIX网络编程 第6章 I/O复用:select和poll函数
- 关于UDP数据报引发“异步错误”的疑问
在UNP卷一第三版的第8章8.9小节中说到:如果udp服务器没有启动,udp客户端在使用sendto发送一行文本后,将会等待一个永远也不会出现的应答从而阻塞在recvfrom调用上. 由于服务器段不存 ...
- JavaScript事件冒泡与捕获
event.preventDefault(); 如果event.cancelable的值为true,可以取消默认事件 event.cancelable; 元素是否可以取消 ...