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, ...
随机推荐
- 【leetcode 简单】 第九十八题 第三大的数
给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...
- shell if判断中常用的a-z表达式含义
shell if判断中常用的a-z表达式含义 可通过在在linux中man test命令查看下列参数的详细用法 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 ...
- python调用百度语音识别接口实时识别
1.本文直接上干货 奉献代码:https://github.com/wuzaipei/audio_discern/tree/master/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5% ...
- node的导入导出
node的每一个文件,都是一个域,那么里面所有的变量都不允许被外界引用,除非导出.要使用外界的变量,也必须使用导入的方式来导入.import 文件路径. css可以直接使用import +文件路径导入 ...
- go 匿名函数和闭包
匿名函数 1. 函数也是一种类型,因此可以定义作为一个函数类型的变量 package main import "fmt" // 函数作为参数 func add(a, b int) ...
- mysql修改表的存储引擎(myisam<=>innodb)【转】
修改表的存储引擎myisam<=>innodb 查看表的存储引擎mysql> show create table tt7;+-------+--------------------- ...
- IDL界面程序直接调用envi菜单对应功能
参考自http://blog.sina.com.cn/s/blog_764b1e9d010115qu.html 参考文章的方法是构建一个button控件,通过单击实现,这种方法比较复杂,不是我们经常能 ...
- JavaScript新手学习笔记(一)
1.JavaScript 对大小写敏感. JavaScript 对大小写是敏感的. 当编写 JavaScript 语句时,请留意是否关闭大小写切换键. 函数 getElementById 与 getE ...
- Webmin试玩
安装: # cd /opt # wget http://www.webmin.com/jcameron-key.asc # wget http://www.webmin.com/download/rp ...
- 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)
Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...