python json文本处理详解_ghostwritten的博客-程序员宅基地_python json转文本

技术标签: python  

python 模块 json 文本处理


1. json介绍

JSON 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
数据格式可以简单地理解为键值对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

2. 方法

2.1 json.dumps

dump的功能就是把Python对象encode为json对象,一个编码过程。注意json模块提供了json.dumps和json.dump方法,区别是dump直接到文件,而dumps到一个字符串,这里的s可以理解为string。

2.2 json.dump

不仅可以把Python对象编码为string,还可以写入文件。因为我们不能把Python对象直接写入文件,这样会报错TypeError: expected a string or other character buffer object,我们需要将其序列化之后才可以。

2.3 json.loads

从Python内置对象dump为json对象我们知道如何操作了,那如何从json对象decode解码为Python可以识别的对象呢?是的用json.loads方法,当然这个是基于string的,如果是文件,我们可以用json.load方法。

实例1:

#!/usr/bin/python

import json

data = [ {
     'a':'A', 'b':(2, 4), 'c':3.0} ]
print 'DATA:', repr(data)

data_string = json.dumps(data)
print 'JSON:', data_string

print type(data)
print type(data_string)

with open('output.json','w') as fp:
	json.dump(data,fp)

print type(fp)
decoded_json = json.loads(data_string)
print type(decoded_json)

print decoded_json[0]['a']



loaded_json = json.load(fp)
print type(loaded_json)
print loaded_json()

json和Python对象转换过程中,数据类型不完全一致,有对应。

Python Json
dict object
list,tuple array
str,unicode string
int,long,float number
TRUE TRUE
FALSE FALSE
None null

3. json.dumps常用参数

一些参数,可以让我们更好地控制输出。常见的比如sort_keys,indent,separators,skipkeys等。

3.1 sort_keys

输出时字典的是按键值排序的,而不是随机的。

import json

data = [ {
     'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

unsorted = json.dumps(data)
print 'JSON:', json.dumps(data)
print 'SORT:', json.dumps(data, sort_keys=True)

输出:

$ python js2.py
DATA: [{
    'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{
    "a": "A", "c": 3.0, "b": [2, 4]}]
SORT: [{
    "a": "A", "b": [2, 4], "c": 3.0}]

3.2 indent

就是更个缩进,让我们更好地看清结构。

import json

data = [ {
     'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

print 'NORMAL:', json.dumps(data, sort_keys=True)
print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)

输出:

$ python js3.py
DATA: [{
    'a': 'A', 'c': 3.0, 'b': (2, 4)}]
NORMAL: [{
    "a": "A", "b": [2, 4], "c": 3.0}]
INDENT: [
  {
    
    "a": "A", 
    "b": [
      2, 
      4
    ], 
    "c": 3.0
  }
]

3.3 separators

提供分隔符,可以出去白空格,输出更紧凑,数据更小。默认的分隔符是(', ', ': '),有白空格的。不同的dumps参数,对应文件大小一目了然。

data = [ {
     'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)
print 'repr(data)             :', len(repr(data))
print 'dumps(data)            :', len(json.dumps(data))
print 'dumps(data, indent=2)  :', len(json.dumps(data, indent=2))
print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))

输出:

DATA: [{
    'a': 'A', 'c': 3.0, 'b': (2, 4)}]
repr(data)             : 35
dumps(data)            : 35
dumps(data, indent=2)  : 76
dumps(data, separators): 29

3.4 ensure_ascii

支持中文
print json.dumps(servies,ensure_ascii=False)

4. error错误

json需要字典的的键是字符串,否则会抛出ValueError。

data = [ {
     'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]

print 'First attempt'
try:
    print json.dumps(data)
except (TypeError, ValueError) as err:
    print 'ERROR:', err

print
print 'Second attempt'
print json.dumps(data, skipkeys=True)

输出:

First attempt
ERROR: keys must be a string

Second attempt
[{
    "a": "A", "c": 3.0, "b": [2, 4]}]

参考:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xixihahalelehehe/article/details/106550900

智能推荐

【转载】Nodejs异步流程控制Async_huang_sir_91的博客-程序员宅基地

前言:    最近在新公司接触到的项目用的版本比较的node。因此没有es6的一些特性,如promise/await等。网上查找到的一篇很好的介绍async的api的文章。在这里转载一下。方便以后查看http://blog.fens.me/nodejs-async/Nodejs异步流程控制Async从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架w...

httpsqs 非常小的轻量级消息队列服务_任亚军的博客-程序员宅基地

优点:1、基于HTTP协议,非常简单 2、速度很快。 3、支持多种接口。   缺点:不支持阻塞式消息读取。

jenkins与gitlab持续集成配置webhook报500错误_ERD Online的博客-程序员宅基地

错误现象:控制台日志:URI::InvalidURIError (URI::InvalidURIError): lib/gitlab/proxy_http_connection_adapter.rb:14:in `connection' app/services/web_hook_service.rb:73:in `make_request' app/services/web_ho...

struts图片上传,字符串处理,流处理_0_o_c的博客-程序员宅基地

1、前端上传的主要代码: 2、后台处理主要代码: String root=ServletActionContext.getServletContext().getRealPath("/");

转起来:Jeff Molofee(NeHe) 的 OPENGL 教程-第四课_烟波三千里人鬼五百年的博客-程序员宅基地

<!--font { font-family: Arial; line-height: 180%; font-size: 12pt; margin-top: 2; margin-bottom: 2 }body { font-family: font }td { border-left-co

随便推点

信息系统规划方法-Zachman框架_gonewithwind818的博客-程序员宅基地_信息系统规划方法

Zachman框架分为5个层次,代表不同类型的项目涉众的看法和观点,同时明确了企业架构工作的流程和流程承担者。 第一行是企业的管理层,是企业的规划和管理人员的范畴,定义了组织的方向和目的,以及架构工作的边界,明确架构所支持的业务范围,规划系统在功能、性能和成本等方面的整体要求。 第二行是企业的业务层,是系统的拥有者范畴,用业务术语来定义组织的...

实例和对象_ladliu的博客-程序员宅基地

这两种的区别是什么?类-->对象-->实例 人类是类 某个人是对象 你是实例 实例本身也是对象。 表现出来是这样的 String 类 String str str是对象 String str = "abc"; "abc"是实例,也是对象. 这样也能解释instance of object这种说法 str的实例是"abc" 那可以理解为实例是对象拥有了数据就构成了实例,如果一个对象他没有

Android之条形码、二维码扫描框架(非原创)_weixin_30402343的博客-程序员宅基地

文章大纲一、条形码、二维码扫描框架介绍二、条形码、二维码的区别和组成结构介绍三、条形码、二维码扫描框架应用场景四、BGAQRCode-Android框架实战五、项目源码下载六、参考文章一、条形码、二维码扫描框架介绍Android二维码扫描是一种常见的功能开发,但是技术选型不当会造成初期开发难度大、后期维护成本高。常见的Android二维码扫码解决方案很多,比如ZXing,b...

React Native Application和Activity源码分析_Jesse-csdn的博客-程序员宅基地

基于V0.43.3版本 React Native Android端的ReactApplication和ReactActivity的实现原理.

使用AWS SDK for Java创建并启动EC2实例_十豆彡v彡的博客-程序员宅基地_aws sdk 启动实例

本文主要记录如何使用AWS SDK for Java来创建并启动EC2实例

LimeSDR实验教程(10) DVB-S发射和接收_老邵的开源世界的博客-程序员宅基地

我在windows下实现了dvb-s的发射和接收。发射使用的是limesdr-mini,接收使用的是hackrf/limesdr-usb。这次和以前的dvb-t发射不同,这次的发射和接收都是用软件实现的,并且都是开源的,以前的dvb-t接收机虽然是rtlsdr,但是是用芯片解调的dvb-t。不过接收机是sdrangel,有点难编译,并且datv express编译好的版本好像也只有wi...

推荐文章

热门文章

相关标签