python进程中的实例和json格式的字符串之间的映射关系是非常直接的,相当于同一个概念被编码成不同的表示:

stream in json form ----json.loads(str)-----> python object

stream in json form <----json.dumps(obj)----- python object

不过需注意类型的匹配,否则会报错。比如说json格式中大括号中的键值应当写成字符串。概念上json文本和python数据类型之间的对应关系是:

有没有觉得实在是太简单了!当然很重要的原因在于,json格式本身能很好的表达对象的概念。

PS: encode和decode这两个词的含义并没有明显的界限,都表示把同一个概念用不同的形式来表示。encode一般表示把概念在内存中的表示转换成在外存中的表示,decode则相反。

dumps()的参数

json.dumps()方法提供了很多好用的参数可供选择,比较常用的有sort_keys,separators,indent等参数。

参数值 sort_keys=True 表示对dict对象进行排序,我们知道默认dict是无序存放的。

参数值 indent=4 是缩进的意思,它可以使得数据存储的格式变得更加优雅,json格式的字符串的逗号后具有换行符,花括号和中括号中的内容有缩进。当然,输出的数据被格式化之后,变得可读性更强,但是却是通过增加一些冗余的空白格来进行填充的。json主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据的大小的,无用的空格会占据很多通信带宽,所以适当时候也要对数据进行压缩。

参数值 separator=(",", ":") 的作用是数据压缩,去除冗余空白,减小网络通信量。该参数传递是一个元组,包含分割对象的字符串。

另一个比较有用的dumps参数是skipkeys,默认为False。 dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,则会比较优雅的过度。

不过还是要注意,处理外部输入输出的语句,尽量都写在 try: 语句块中。

自定义对象-json映射

需要自己实现函数。

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __repr__(self):
        return 'Person Object name : %s , age : %d' % (self.name,self.age)
if __name__  == '__main__':
    p = Person('Peter',22)
    print p import json
 
p = Person.Person('Peter',22)
 
def object2dict(obj):
    #convert object to a dict
    d = {}
    d['__class__'] = obj.__class__.__name__
    d['__module__'] = obj.__module__
    d.update(obj.__dict__)
    return d
 
def dict2object(d):
    #convert dict to object
    if'__class__' in d:
        class_name = d.pop('__class__')
        module_name = d.pop('__module__')
        module = __import__(module_name)
        class_ = getattr(module,class_name)
        args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args
        inst = class_(**args) #create new instance
    else:
        inst = d
    return inst
 
d = object2dict(p)
print d
#{'age': 22, '__module__': 'Person', '__class__': 'Person', 'name': 'Peter'}
 
o = dict2object(d)
print type(o),o
#<class 'Person.Person'> Person Object name : Peter , age : 22
 
dump = json.dumps(p,default=object2dict)
print dump
#{"age": 22, "__module__": "Person", "__class__": "Person", "name": "Peter"}
 
load = json.loads(dump,object_hook = dict2object)
print load
#Person Object name : Peter , age : 22

直接实现文件的保存

dump(obj,fp) 和 obj=load(obj,fp)直接实现文件的保存,它们具有文件指针fp作为参数,dump函数需要可写指针,load需要可读指针。

file pointer  <-------------->  python object

import json

jsonobj = json.load(open('jsonsource.dat', 'r'))
json.dump(jsonobj, open('newjsonfile.dat', 'w'))

python中还有的pickle模块的用法也是类似的。

下面在讲解一些其他python细节知识。

python异常处理

为什么要用异常处理?因为当出现异常的时候,如果直接退出程序会导致程序太容易崩溃,如果只是简单打印调试信息又会导致运行时不能发现准确发现错误,所以在正式的开发中需要异常的引发和捕获。

异常处理包括异常的引发和捕获。很多错误是可以预料的,比如处理非法的输入,比如通信错误等等,我们常常需要在一些基础服务函数中引发异常,让上层代码捕获,而不是简答的打印错误信息或者简单的退出程序。

python使用 raise Exception("info") 来引发异常,用 try: except Exception, e: 来捕获在语句块中出现的任何异常:

try:
a=2/0
b=a[2]
except Exception,e:
print Exception,":",e

如果仅仅是传递异常到更外层的代码,也就是不做任何其他处理,则只需单独使用 raise 关键字即可。

对异常的引发,要注意粒度的选择,要不然不知道到底是哪里出了问题。

对于异常的捕获,else 关键字基本上不需要用太多,直接在try中完成任务就可以了。

python字符串处理

ps:在 python中用正则表达式处理文本的编码范式是 :  regex = re.compile(oldstring) ,然后  re.__( regex[, newstring], subject) 或者 regex.__([newstring,] subject)

re是一个模块,regex是正则表达式实例(概念上,regex和oldstring是同义词),subject是目标字符串。.subn 和 .sub表示替换,.split 表示分隔,.match 表示匹配

如果不用正则表达式,则只能用字符串类中定义的对应函数 subject.__(oldstring, newstring)

字符串编码与unicode类型

首先需要明确:

(1)在python中 str 和 unicode 是两种不同的对象类型,它们两者可以相互转换,但两个概念没有依赖关系。

(2)一个 str 类型的对象,用不同的编码方法可以有不同的二进制表示。unicode 对象常常作为转换 str 对象编码方式的中间角色。

(3)python进程会把引号 ' ' 解释为创建 str 实例的操作,把字符u后面跟引号 u' ' 解释为创建 unicode 实例的操作。

实验一下str对象和unicode对象的相互转换:

str转unicode,也就是 str ----decode()----> unicode:

>>> s ="\u6d66\u53d1\u94f6\u884c"
>>> s.decode('unicode_escape')
u'\u6d66\u53d1\u94f6\u884c'
>>> print s.decode('unicode_escape')
浦发银行
>>>

相反做法就是 str <----encode()---- unicode :
u'浦发银行'.encode('unicode_escape')

python知识:json格式文本;异常处理;字符串处理;unicode类型和str类型转换的更多相关文章

  1. JSon_零基础_008_将JSon格式的"数组"字符串转换为List集合

    将JSon格式的"数组"字符串转换为List集合. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, ...

  2. JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"

    将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...

  3. JSon_零基础_005_将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面

    将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写:po(bean)代码: package com.west.webcourse.po; /** * 第 ...

  4. JSon_零基础_005_将po(bean)对象转换为JSon格式的对象字符串,返回给界面

    将po(bean)对象转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写po(bean)类: package com.west.webcourse.po; /** * 第01步:编写be ...

  5. JSon_零基础_004_将Set集合对象转换为JSon格式的对象字符串,返回给界面

    将Set集合对象转换为JSon格式的对象字符串,返回给界面 需要导入的jar包: 编写:servlet: package com.west.webcourse.servlet; import java ...

  6. JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面

    将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...

  7. JSon_零基础_002_将List类型数组转换为JSon格式的对象字符串,返回给界面

    将List类型数组转换为JSon格式的对象字符串,返回给界面 所需要导入的包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * ...

  8. python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

  9. python将json格式的数据转换成文本格式的数据或sql文件

    python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon ...

随机推荐

  1. hadoop 2.0 lzo 问题

    首先搞到lzo在github https://github.com/cloudera/hadoop-lzo/   ant package 对应的机器上把build目录下的native压缩,传给所有机器 ...

  2. unity Transform Find 的用法!!!

    用法: Transform Find(String name) 1.查找名为name的(transform.gameObject)直接子物体并返回该子物体的Transform属性.不能是孙子物体或更低 ...

  3. 负载均衡之Haproxy配置详解(及httpd配置)

    下图描述了使用keepalived+Haproxy主从配置来达到能够针对前段流量进行负载均衡到多台后端web1.web2.web3.img1.img2.但是由于haproxy会存在单点故障问题,因此使 ...

  4. 使用 Nginx 和 GeoIP 模块来处理不同国家的访问

    安装 Nginx因为要用到 http_geoip_module 模块,系统自带的 nginx 一般不带这个模块,所以要下载 nginx 源代码后自行编译: # wget http://nginx.or ...

  5. Keil MDK编译器(V4.03)与J-LINK使用

    前几天进手了一个J-LINK,因为H-JTAG毕竟对MDK支持的不是太完美,比如用keil mdk上面的下载按钮烧录程序,不是直接就能烧录进去,而是弹出H-Flash软件,再手工选择文件烧录:而且用H ...

  6. 自己写的中间层..基于通讯组件 RTC

    273265088 我用原生Listbox与你的组件组合...创造了奇迹..搞了一个非常复杂的 UI .. 每个item高度 包括里面的元素 以及事件都是动态的搞了好几个小时感觉UI 非常完美比客户要 ...

  7. CentOS查看内核版本,位数,版本号

    1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@builder10.CentOS.org ...

  8. mysql 日期

    数据类型 数据类型 格式 date YYYY-MM-DD datetime YYYY-MM-DD HH:MM:SS timestamp YYYY-MM-DD HH:MM:SS year YYYY 或 ...

  9. android ProgressBar 样式讲解

    转载自:eoe社区,可惜没找到源地址... 多式样ProgressBar 普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中. 一 ...

  10. sed文本处理知识点整理

    参考资料:http://man.linuxde.net/sed    <鸟哥的私房菜> sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用.sed 后面接的操作 ...