Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29337085
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2010-03-16 14:18:27

python中操作JSON学习整理

[整理学习:遥方 整理时间:2010-3-16]

序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方。(实际上, 很多非游戏程序也会这么干。) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来。这个数据只会被创建它的程序使用,不会发送到网 络上,也不会被其它程序读取。因此,互操作的问题被限制在保证新版本的程序能够读取以前版本的程序创建的数据。

在这种情况下,pickle 模块是理想的。它是Python标准库的一部分, 所以它总是可用的。它很快; 它的大部分同Python解释器本身一样是用C写的。 它可以存储任意复杂的Python数据结构。

什么东西能用pickle模块存储?

1、所有Python支持的 : 布尔, 整数, 浮点数, 复数, 字符串, bytes(字节串)对象, 字节数组, 以及 None. (八种原生类型python

2、   由任何原生类型组成的列表,元组,字典和集合。 (组成单元为原生类型)

3、   由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).

4、   函数,类,和类的实例(带警告)

开始尝试测试:

打开两个pythonshell窗口出来。分别定义两个变量:

>>>shell=1

>>>shell=2

2、保存数据到PICKLE文件

pickle模块的工作对象是数据结构

在窗口一中:输入如下的东西 创建一个字典

>>> entry = {}                                                                                        
>>> entry['title'] = 'Dive into history, 2009 edition'
>>> entry['article_link'] = '2009/03/27/dive-into-history-2009-edition'
>>> entry['comments_link'] = None
>>> entry['internal_id'] = '1'
>>> entry['tags'] = ('diveintopython', 'docbook', 'html')
>>> entry['published'] = True
>>> import time
>>> entry['published_date'] = time.strptime('Fri Mar 27 22:20:42 2009')      

发现这个字典里面包含了多种复杂的数据结构包括了字符串、数字、布尔类型、还有元组等等。现在将其保存到一个文件中去

 

不好意思!发现这段居然是3.0版本的我的暂使用2.5版本。所以等有空再来整理一下有关python里面的序列化操作的方法!

 

 

 

 

一、介绍一下有关python里面的模块

学习过marshal模块用于序列化和反序列化,但marshal的功能比较薄弱,只支持部分内置数据类型的序列化/反序列化,对于用户自定义的类型 就无能为力,同时marshal不支持自引用(递归引用)的对象的序列化。所以直接使用marshal来序列化/反序列化可能不是很方便。还好,python标准库提供了功能更加强大且更加安全的picklecPickle模块。

cPickle模块是使用C语言实现的[好像Python里面用C语言实现的都是以c打头],所以在运行效率上比pickle要高。但是cPickle模块中定义的类型不能被继承(其实大多数时候,我们不需 要从这些类型中继承。)。cPicklepickle的序列化/反序列化规则是一样的,我们可以使用pickle序列化一个对象,然后使用 cPickle来反序列化。同时,这两个模块在处理自引用类型时会变得更加聪明,它不会无限制的递归序列化自引用对象,对于同一对象的多次引用,它只 会序列化一次。

示例:

>>> import pickle

>>> list=[1]

>>> list.append(list)

>>> byt2=pickle.dumps(list)    

Pickle的序列化规则:

默认情况下,pickle的序列化是基于文本的,我们可以直接用文本编辑器查看序列化的文本。我们也可以序列成二进制格式的数据,这样的结果体积会更小。

1、   dump(obj,file[,protocol])

序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是12,表示以二进制的形式序列化。

2、   load(file)

反序列化对象。将文件中的数据解析为一个Python对象。

示例:

#-*- coding: utf-8 -*-

import pickle, StringIO

class Person(object):

    def __init__(self, name, address):

        self.name = name

        self.address = address

   

    def display(self):

        print 'name:', self.name, 'address:', self.address

       

jj = Person("JGood", "hello")

jj.display()

 

file = StringIO.StringIO()

 

pickle.dump(jj, file, 0)         #序列化

 

file.seek(0)

jj1 = pickle.load(file)         #反序列化

jj1.display()

file.close()

注意:在反序列化的时候,必须能找到对应类的定义,否则反序列化将失败。在上面的例子中,如果取消#del Person的注释,在运行时将抛AttributeError异常,提示当前模块找不到Person的定义。

pickle.dumps(obj[, protocol])

pickle.loads(string)

  我们也可以直接获取序列化后的数据流,或者直接从数据流反序列化。方法dumpsloads就完成这样的功能。dumps返回序列化后的数据流,loads返回的序列化生成的对象。

二、Python模块学习 ---- StringIO, cStringIO 内存文件

StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的文件,我们可以将操作磁盘文件那样来操作StringIO(可以非常方便地操作磁盘文件包括读、写定位操作等)

我们看到了StringIO的行为,基本与file一致。StringIO提供了一个方法,可以方便的获取其中的数据:StringIO.getvalue()。如果使用read方法获取其中的数据,必须通过seek先设置"文件指针"的位置。

示例:

import StringIO,sys

>>> s=StringIO.StringIO("Job is a good")

>>> s.write("hkebao")           #往内存文件里面写

>>> s.seek(0)      

>>> print s.read()              #获取其中的数据值

三、学习JSON模块使用

此模块的基本使用语法

Json.dump(obj, fp[, skipkeys[, ensure_ascii[, check_circular[, allow_nan[, cls[, indent[, separators[, encoding[, default[, **kw]]]]]]]]]])

序列化一个对象类似于JSON格式

未完。需要整理python里面的三个模块分别为pickle StringIO json



python处理JSON方法整理

整理人:遥方 时间:2010-05-31

python中的json解释库有好几个,其中不同版本有使用上的差异。

常用有 json-py smiplejson 两个包

其中json-py 包含一个minjson,用法一样,只是import import minjson

两个用法上有差别, import语句一样,

 

import json   # 都是如此import的。

import minjson

 # json-py库用法

json.read( js_obj )

json.write(py_obj)

#jsonminjson用法 

minjson.read( js_obj )

minjson.write(py_obj)

# smiplejson  的用法

json.loads(js_obj)   

json.dumps(py_obj)

python2.5没有内置的json,要手动安装。我们现在使用的是 json-py3.4
python2.6
内置json解释库,是 smiplejson

smiplejson  2.09 下载 

json-py 3.4  下载 

      JSON包下载下来!

 

以上是网上一个朋友写的。我下载下来看下

整理1

JSON的读写:

json.read(js_obj)

json.write(py_obj) 

MinJSON的读写

minjson.read(js_obj) 

minjson.write(py_obj)

Simplejson的读写

simplejson.loads(js_obj) 

simplejson.dumps(py_obj)

 

 

 

 

 

 

 

 

作者的结论:

基于以上,个人感觉使用 minjson.py比较保险,现在我们开发使用的是 json-py速度最慢那个。。。

因为minjson.py只 有一个文件,建议直接复制到工程公共库目录下,直接使用,免去安装痛苦。

 

下文:介绍一下minjson的使用规则

>>> import json

>>> data=json.read('{"firstname":"hkebao","lastname":"sun"}')

>>> print data['firstname']

Hkebao

笔记:依据read方法将一串JSON字符串!读入到内存中去。程序在提取其值的时候也是依据PYTHON里面的字典的方式进行提取出来的。

 

一般我们处理的流程也是:

1、构造出来一串JSON字符串

2、将其依据JSON写入到内存。在内存中再提取出来。

示例

src = '''

    { "name": "Patrick", "age" : 44, "Employed?" : true, "Female?" : false, "grandchildren":null }

'''

obj = json.read(src)

self.assertEqual("Patrick", obj["name"])

 

其实我们在服务端像Django在输出数据返回到客户端的时候就可以这样来拼结

Return HttpResponse(src)

返回一段JSON数据。在客户端直接使用JS来解析

 

Python 来解析也是非常容易的。动态拼结成一个字符串。然后再保存

 

阅读(1918) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-25 17:50:34

data=json.read('{"firstname":"hkebao","lastname":"sun"}') print data 输出: {'lastname': 'sun', 'firstname': 'hkebao'} 咦~~~怎么会变成单引号了???