python爬虫系列之数据的存储(一):json库的使用

在上一篇文章里我们讲了 xpath写法的问题还以爬取我的文章信息写了示例,但是在上一篇中我们只是爬取并打印了信息,并没有对信息进行保存。

实际应用中爬取到的信息肯定是需要保存到本地的。保存信息的方式有数据库和文件的形式,数据库我们后面再讲,现在让我们先看看怎么把信息保存到文件里。

这里我们主要讲讲 将数据保存为 json格式和 csv格式,这就要用到两个库 json库和 csv库,这两个库都是 python自带的库。

关于数据存储我们分两篇来讲,这一篇先讲 json,下一篇再讲 csv。

一、关于 json

json的简介直接引用百度百科的定义:

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

实际上 json的格式和 python中的字典很像,也是由键值对组成,但是 python中的值可以为任何对象(列表、字典、字符串、数字等等),而 json中的值只能是数组(列表)、字典、字符串、数组、布尔值中的一中或几种。

其格式就像下面这样:

注意:json中的引号必须是双引号,否则会报错

{
    "key1": "value1",
    "key2": [1,2,"value2"],
    "key3": 
    {
        "key31": "value1",
        "key32": [1,2,"value2"],
        "key33": true,
    },
}

二、json库的使用

json库一共有三个方法,分别是 dump、dumps、load、loads。

其中 dump和 dumps是用来把把字典和数组转换为 json格式的,dump把转换结果直接写入文件,dumps返回字符串。

load和 loads是把 json格式的数据转换为字典格式,load直接从 json文件中读取数据并返回字典对象,loads把字符串形式的 json数据转换成字典格式。

下面讲讲这些方法的具体用法。

1、dump和 dumps

dump的函数原型是 dump(obj, fp) 第一个参数 obj是要转换的对象,第二个参数 fp是要写入数据的文件对象。

dumps的函数原型是 dumps(obj) 参数是要转换的对象

注意:如果要转换的对象里有中文字符的话,要把 ensure_ascii设置为 False否则中文会被编码为 ascii格式

#-*- coding: utf-8 -*
import json


test = {
    "key1": "value1",
    "key2": [1,2,"value2"],
    "key3":
    {
        "key31": "value1",
        "key32": [1,2,"value2"],
        "key33": True,
        "key34": "测试",
    },
}

#没有设置 ensure_ascii为 False
with open('test.json', 'w', encoding='utf-8') as fp:
    json.dump(test, fp)
#设置了 ensure_ascii为 False
with open('test_no_ascii.json', 'w', encoding='utf-8') as fp:
    json.dump(test, fp, ensure_ascii=False)

#test.json的文件内容为:
#{... ... "key33": true, "key34": "\u6d4b\u8bd5"}}
#test_no_ascii.json的文件内容为:
#{... ... "key33": true, "key34": "测试"}}
#注意到 python中的 True转换成了 Javascript里的 true
#另外在打开文件的时候强烈建议用 encoding指定文件编码
#还需要注意文件的打开模式 w是写入,文件已存在的话就覆盖
#要追加写入的话记得用 a模式打开

test_string = json.dumps(test, ensure_ascii=False)
print(test_string)

打印结果:

2、load和 loads

load的函数原型是 load(fp) 参数 fp是要读取的文件对象

loads的函数原型是 loads(string) 参数 string是要转换成 python对象的 json字符串,通常用来将网页中的 json数据转换为 python对象

#-*- coding: utf-8 -*
import json


#json格式的字符串
test_string = '{"key1": "value1", "key2": [1, 2, "value2"], "key3": {"key31": "value1", "key32": [1, 2, "value2"], "key33": true, "key34": "测试"}}'

#从之前保存的 test_no_ascii.json中读取 注意模式为 r
with open('test_no_ascii.json', 'r', encoding='utf-8') as fp:
    json_obj_from_file = json.load(fp)

json_obj_from_web = json.loads(test_string)

#打印两个返回结果的类型
print(type(json_obj_from_file))
print(type(json_obj_from_web))
#打印两个返回结果的内容
print(json_obj_from_file)
print(json_obj_from_web)

打印结果:

csv库在下一篇继续讲,点赞就是对我最大的支持(~ ̄▽ ̄)~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

设计模式之桥接模式(Bridge 模式)类的功能层次类的实现层次类的层次结构的混杂与分离桥接模式的具体实例小结

Bridge的意思是桥梁,作用就是将两边连接起来。桥接模式的作用也是如此,桥接模式分别类的功能层次和类的实现层次连接起来。

751
来自专栏Java开发者杂谈

Python(1):入门

安装:    在linux中一般都自带有python2.7的版本,如果想升级python到最新的版本可以参考其他博客(http://www.cnblogs.c...

3658
来自专栏java达人

关于hashmap在多线程环境下的一个小实验

我们都知道hashmap是非线程安全的,平时我们经常是在单线程环境下使用这个类的,现在我们模拟一个多线程环境,并发操作访问一个hashmap实例,看看会出现什么...

2285
来自专栏技术记录

Protobuf3语法详解

8715
来自专栏码字搬砖

JVM内存模型之栈

内容 HotSpot将java虚拟机栈与本地方法栈合并成一个了(操作系统中的栈是通过硬件ESP、EBP寄存器来实现的)。虚拟机的栈在细分,分为: 当前栈...

1083
来自专栏用户2442861的专栏

【深入Java虚拟机】之四:类加载机制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17881581

571
来自专栏python3

python类(class)

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例,把所有相似的功能都封装到一个类里,最理...

1043
来自专栏salesforce零基础学习

salesforce 零基础学习(二十四)解析csv格式内容

salesforce中支持对csv格式的内容批量导入,可以使用dataloader,然而有些情况下,当用户没有相关权限使用dataloader导入情况下,就的需...

22410
来自专栏java系列博客

深入理解Java内存模型(二)——重排序

2044
来自专栏GreenLeaves

C#核编之一个简单的C#程序

构建一个简单的C#应用程序需要注意一下几点: 1、C#要求所有的程序逻辑都包含在一个类型定义中   --->这里的类型指的是(类,接口,结构,枚举,委托中的一个...

19410

扫码关注云+社区