Python爬虫(3)

Python爬虫之数据处理

json

基本介绍

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
一些好用的json转换网站:www.json.cn

JSON支持数据格式:

  • 对象(字典)。使用花括号。
  • 数组(列表)。使用方括号。
  • 整形、浮点型、布尔类型还有null类型。
  • 字符串类型(字符串必须要用双引号,不能用单引号)。

多个数据之间使用逗号分开。
注意: json本质上就是一个字符串。

将python对象转换为json字符串

dump和dumps

举例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#encoding: utf-8

import json

# 将python对象转换为json字符串

persons = [
{
'username':"张三",
'age': 18,
'country': 'china'
},
{
'username': '李赛',
'age': 20,
'country': 'china'
}
]

# 方法一
# json_str = json.dumps(persons) # dumps注意有s
# with open('person.json','w') as fp:
# fp.write(json_str)

# 方法二
# 因为json在dump的吋候,只能存放ascii的字符,因此会将中文迸行转义,这吋候我们可以使用ensure_ ascii=False 关闭这个特性。

with open('person.json','w',encoding='utf-8') as fp:
json.dump(persons,fp,ensure_ascii=False) # 第二个参数是为了中文不会变成ASCII码形式,dump注意没有s

# 在Python中。只有基本数据类型オ能转换成json格式的字符串。也即: int 、float、list、dict 、tuple o

# class Person(object):# 非基本数据类型不能被转化为json.
# country = 'china'
#
# a = {
# 'person': Person()
# }
# json.dumps(a)

运行结果:生成一个person.json文件里面的内容是:

1
[{"username": "张三", "age": 18, "country": "china"}, {"username": "李赛", "age": 20, "country": "china"}]

将一个json字符串转化成python对象

load 和loads

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#encoding: utf-8
import json

# 方法一
json_str = '[{"username": "张三", "age": 18, "country": "china"}, {"username": "李赛", "age": 20, "country": "china"}]'
persons = json.loads(json_str)
print(type(persons))
for person in persons:
print(person)

# 方法二
# with open('person.json','r',encoding='utf-8') as fp:
# persons = json.load(fp)
# print(type(persons))
# for person in persons:
# print(person)

运行结果:

1
2
3
<class 'list'>
{'username': '张三', 'age': 18, 'country': 'china'}
{'username': '李赛', 'age': 20, 'country': 'china'}

CSV

基本介绍

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

  • 纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;
  • 由记录组成(典型的是每行一条记录);
  • 每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
  • 每条记录都有同样的字段序列。

读取csv文件

reader()返回列表下标读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#encoding: utf-8

import csv


# 通过下标获取
def read_csv_demo1():
with open('stock.csv', 'r') as fp:
# reader是一个迭代器
reader = csv.reader(fp) # 列表
next(reader) # 向下面移动一行 ,跳过标题数据
for x in reader:
name = x[3]
volumn = x[-1]
print({'name': name, 'volumn': volumn})

if __name__ == '__main__':
read_csv_demo1()

DictReader()返回字典key读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#encoding: utf-8

import csv

# 通过key获取
def read_csv_demo2():
with open('stock.csv','r') as fp:
# 使用DictReader创建的reader对象
# 不会包含标题那行的数据
# reader是一个迭代器,遍历这个迭代器,返回来的是一个字典。
reader = csv.DictReader(fp) #字典
for x in reader:
value = {"name":x['secShortName'],'volumn':x['turnoverVol']}
print(value)

if __name__ == '__main__':
read_csv_demo2()

写入csv文件

writer()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#encoding: utf-8

import csv

def write_csv_demo1():
headers = ['username', 'age', 'height']
values = [
('張三', 18, 180),
('李四', 19, 190),
('王五', 20, 160)
]

with open('classroom.csv', 'w', encoding='utf-8', newline='') as fp:
# 解决乱码 ,第三个参数是每行结束符,
# 默认为一行空行,这里换成空。
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)

if __name__ == '__main__':
write_csv_demo1()

DictWriter()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#encoding: utf-8

import csv

def write_csv_demo2():
headers = ['username', 'age', 'height']
values = [
{'username':'张三','age':18,'height':180},
{'username':'李四','age':19,'height':190},
{'username':'王五','age':20,'height':160}
]
with open('classroo1.csv','w',encoding='utf-8',newline='') as fp:
writer = csv.DictWriter(fp,headers) # 表头是列表,不会自动写入的
# 写入表头数据的时候,需要调用writeheader方法
writer.writeheader()
writer.writerows(values)


if __name__ == '__main__':
write_csv_demo2()
你可以对我进行打赏哦