Python之json格式化输出
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
data = {'name':'yeyz','job':'DBA','label':['tall','rich','handsome']}
print json.dumps(data, ensure_ascii=False, sort_keys=True, indent=4)
这个测试串的运行结果如下:
{
"job": "DBA",
"label": [
"tall",
"rich",
"handsome"
],
"name": "yeyz"
}
这里首先解释下:json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)
(1)json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串) (2)json.loads()函数是将json格式数据转换为字典(可以这么理解,json.loads()函数是将字符串转化为字典)
这里解释下上面的json.dumps里面的参数,第一个参数不说了,就是串本身,第二个参数ensure_ascii是因为json.dumps序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False,如果我们不适用上面的ensure_ascii=False,这时候的输出结果如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
data = {'name':'yeyz','job':'DBA','label':['高','富','帅']}
print json.dumps(data, sort_keys=True, indent=4)
{
"job": "DBA",
"label": [
"\u9ad8",
"\u5bcc",
"\u5e05"
],
"name": "yeyz"
}
我们可以看到,里面的内容是u开头的ascii字符,而不是汉字,如果我们想西显示汉字,必须使用ensure_ascii=False这个属性。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
data = {'name':'yeyz','job':'DBA','label':['高','富','帅']}
print json.dumps(data, ensure_ascii=False, sort_keys=True, indent=4)
{
"job": "DBA",
"label": [
"高",
"富",
"帅"
],
"name": "yeyz"
}
第二个参数sort_keys代表将数据根据keys的值进行排序,第三个参数indent代表缩进的字符数。
02
localhost和127.0.0.1的区别
今天处理工单的时候,发现了这个小问题,这里记录下,在连接线上的数据库的时候,发现mysql不能登录,具体的登陆命令和报错结果记录了一下:
[dba_mysql@tk-dba-mysql-stat-10-104 ~]$ /usr/local/mysql/bin/mysql -uyeyz --socket=/data/mysql_4306/tmp/mysql.sock --port=4306 -p -h127.0.0.1
Enter password:
ERROR 1045 (28000): Access denied for user 'yeyz'@'127.0.0.1' (using password: YES)
[dba_mysql@tk-dba-mysql-stat-10-104 ~]$ /usr/local/mysql/bin/mysql -uyeyz --socket=/data/mysql_4306/tmp/mysql.sock --port=4306 -p -hlocalhost
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 599175
Server version: 5.5.19-log MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql--yeyz@localhost:(none) 10:10:34>>;
mysql--yeyz@localhost:(none) 10:10:34>>;
mysql--yeyz@localhost:(none) 10:10:34>>;
mysql--yeyz@localhost:(none) 10:10:34>>;
上面分别是连接失败和连接成功的时候的结果,图中的代码可以左滑,我们可以发现,这两个登录的连接串只有最后的-h后面的参数不同,一个是127.0.0.1,另外一个是localhost,localhost可以登录成功,127.0.0.1不能登录成功,之前登录线上其他数据库的时候,某些情况下127.0.0.1也可以登录成功,也没有深究过这个问题,今天研究了这两种登录方式的区别,总结如下:
第一.概念区别
localhost也叫local ,正确解释为:本地服务器 127.0.0.1在系统的正确解释是:本机地址(本机服务器)
第二.连接方式区别
localhot(local)是不经网卡传输。这点很重要,它不受网络防火墙和网卡相关的的限制。访问localhost也不会解析成ip,不会占用网卡、网络资源。而127.0.0.1是需要通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。
换句话说:当时用mysql -h 127.0.0.1 的时候,使用TCP/IP连接;而当我们使用mysql -h localhost 的时候,是不使用TCP/IP连接的,而使用Unix socket;
第三.mysql不能进行自动域名和ip转换
如果我们在mysql中连接数据库,要是定义了localhost的用户权限,连接的时候就要用localhost而不能用127.0.0.1。因为mysql中对于用户的登陆位置是有限定的,具体见mysql数据库(database名字就是mysql)里面的user表,里面存放的ip和存放的域名是不一样的,mysql进行匹配时不会自动将ip转换成域名的。你授权一个用户从这个ip访问,不等于授权它从这个域名访问。
mysql.user表中的部分用户如下:
mysql--dba_admin@127.0.0.1:(none) 20:57:40>>select user,host from mysql.user;
+------------------+-----------------+
| user | host |
+------------------+-----------------+
| dba_admin | 127.0.0.1 |
| srv_dbmonitor_ro | 127.0.0.1 |
| tmp_test_user | 127.0.0.1 |
| tmp_test_user02 | 127.0.0.1 |
| dba_yeyz | localhost |
| root | localhost |
| tkadmin | localhost |
+------------------+-----------------+
我们可以看出,一些用户是可以使用localhost登陆的,另外一些只能通过127.0.0.1来登陆。当我们使用127.0.0.1去代替localhost登陆时,就会出现我上面出现的错误。
除了localhost和127.0.0.1之外,有时候我们会听到本地IP这个概念,关于这个概念,可能有几个意思,我的理解如下:本机来讲,一般有三块网卡,一块网卡叫做 loopback(这是一块虚拟网卡),另外一块网卡叫做 ethernet (这是有线网卡),另外一块网卡叫做 wlan(这是无线网卡)。本机 IP 就是真实网卡的 IP,具体来说有线无线各有一个,而 127.0.0.1 是那块叫做 loopback 的虚拟网卡的 IP。
所以,以后为了确保登陆服务的时候能够避开防火墙和网络的干扰,我们可以尽量时用localhost来代替127.0.0.1这个地址,在开通数据库服务的用户时,也可以尽量开通成localhost类型。