数据存储
- JSON文件格式处理:网络交互
- CSV文件格式处理:数据分析
- Excel文件处理:数据分析和运营
- MySQL数据库处理:数据分析和网站
JSON文件格式处理
- JSON字符串介绍
JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。它基于ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输速率。
JSON支持数据格式:
对象(字典):使用花括号{}。
数组(列表):使用方括号[]。
字符串类型:字符串必须要用双引号,不能用单引号。
整形、浮点型、布尔型还有null类型。
多个数据之间使用逗号分开。
注意:JSON本质上就是一个字符串 - JSON字符串写入
- JSON字符串读取
import json
books = [
{
'name':'三国演义',
'price':56.32,
},
{
'name': '水浒传',
'price': 55.12,
},
]
# json_str = json.dumps(books,ensure_ascii=False) #ensure_ascii=True时只支持ascii码
# print(json_str) #[{"name": "三国演义", "price": 56.32}, {"name": "水浒传", "price": 55.12}]
# print(type(json_str)) #<class 'str'>
# res = json.loads(json_str)
# print(res)
# print(type(res)) #<class 'list'>
# fp = open('books.json','w',encoding='utf-8')
# json.dump(books,fp,ensure_ascii=False)
with open('books.json','r',encoding='utf-8') as f:
res = json.load(f)
print(res)
print(type(res))
#dumps可以将python对象转化成json格式的字符串,loads则相反
#dump可以将python对象转化成json格式的字符串并保存在文件中,load则相反
#dumps和dump这两个方法都有一个ensure_ascii参数,默认情况下这个参数的值是True,也就是说转换后的JSON字符串只能存储ascii格式的,如果想要存储成中文的,那么可以将它设置成False
CSV文件格式处理
读取CSV文件的两种方式
import csv
#第一种:这种方式读取到的每一条数据是一个列表
with open('stock.csv','r',encoding='utf-8') as f:
reader = csv.reader(f)#创建一个可读对象
for x in reader:
print(x) #列表
#第二种:这种方式读取到的每一条数据是一个字典
with open('stock.csv','r',encoding='utf-8') as f:
reader = csv.DictReader(f)#创建一个可读对象
for x in reader:
print(x['secShortName']) #字典
写入CSV文件的两种方式
- 使用writerow:写入数据到csv文件,需要创建一个writer对象,主要用到两个方法。一个是writerow写入一行(一般先写表头),一个是writerows写入多行(写数据)
- 使用DicWriter:也可以使用字典的方式把数据写入进去。
import csv
# header = ('name','age','height')
# students = [('wuyuli',18,182),('zhangsan',15,170),('lisi',16,180)]
# with open('students.csv','w',encoding='utf-8',newline='') as f: #newline=''指定不换行
# writer = csv.writer(f)
# writer.writerow(header) #先写表头
# writer.writerows(students) #再写数据
header = ('name','age','height')
students = {
{'name':'wuyuli','age':18,'height':182},
{'name': 'zhangsan', 'age': 15, 'height': 165},
{'name': 'lisi', 'age': 20, 'height': 180},
}
with open('students.csv','w',encoding='utf-8',newline='') as f: #newline=''指定不换行
writer = csv.DictWriter(f,header)
#虽然DictWriter创建的时候有一个header,但是想要写入数据进去,还需要调用writer.writeheader()方法,否则表头写不进去
writer.writeheader()
writer.writerows(students)
Excel文件处理
- 读取Excel文件。
- 编辑Excel文件。
在爬虫开发中,我们主要关注Excel文件的读写,不过过多的关心Excel中的一些样式,如果想要读写Excel文件,需要借助到两个库xlrd和xlwt,其中xlrd是用于读的,xlwt是用于写的,安装命令如下:
pip insatll xlrd
pip insatll xlwt
读取Excel文件
import xlrd
workbook = xlrd.open_workbook("成绩表.xlsx")
#######################sheet相关操作##################################
#获取所有的sheet的名字
print(workbook.sheet_names()) #['1班', '2班']
#sheet_by_index根据索引获取sheet对象
sheet = workbook.sheet_by_index(0)
print(sheet.name) #1班
#sheet_by_name根据名字获取sheet对象
sheet = workbook.sheet_by_name('2班')
print(sheet.name) #2班
#sheets获取所有的sheet
sheets = workbook.sheets()
for sheet in sheets:
print(sheet.name)
#sheet.nrows:这个sheet中的行数
#sheet.ncols:这个sheet中的列数
sheet = workbook.sheet_by_index(0)
print('列数:',sheet.ncols,'行数:',sheet.nrows)
#######################cell相关操作##################################
sheet = workbook.sheet_by_index(0)
#获取cell及其属性,每个cell代表的是表格中的一格
#1.sheet.cell(row,col):获取指定行和列的cell对象
cell = sheet.cell(0,0) #获取0行0列的cell
print(cell)
print(cell.value)
#2.sheet.row_slice(row,start_col,end_col):获取指定行的某几列的cell对象
cells = sheet.row_slice(2,0,4)
for cell in cells:
print(cell.value)
#3.sheet.col_slice(col,start_row,end_row):获取指定列的某几行的cell对象
cells = sheet.col_slice(0,1,19)
for cell in cells:
print(cell.value)
#4.sheet.cell_value(row,col):获取指定行和列的值
cell = sheet.cell_value(1,0)
print(cell)
#5.sheet.row_values(row,start_col,end_col):获取指定行的某几列的值
cells = sheet.row_values(2,0,3)
for cell in cells:
print(cell)
#6.sheet.col_values(col,start_row,end_row):获取指定列的某几行的值
cells = sheet.col_values(0,1,5)
for cell in cells:
print(cell)
cell的数据类型
- xled.XL_CELL_TEXT(Text):文本类型
- xled.XL_CELL_NUMBER(Number):数值类型
- xled.XL_CELL_DATE(Date):日期时间类型
- xled.XL_CELL_BOOLEAN(Bool):布尔类型
- xled.XL_CELL_EMPTY(Empty):空白数据类型
#######################cell的数据类型##################################
import xlrd
workbook = xlrd.open_workbook("成绩表.xlsx")
sheet = workbook.sheet_by_index(0)
cell = sheet.cell(0,0)
print(cell.value) #姓名
print(cell.ctype) #1:代表文本类型
print(xlrd.XL_CELL_TEXT) #1
cell = sheet.cell(2,2)
print(cell.value) #100.00
print(cell.ctype) #2:代表数值类型
print(xlrd.XL_CELL_NUMBER) #2
cell = sheet.cell(19,0)
print(cell.value) #43748.0
print(cell.ctype) #3:代表时间日期类型
print(xlrd.XL_CELL_DATE) #3
cell = sheet.cell(19,1)
print(cell.value) #1
print(cell.ctype) #4:代表布尔类型
print(xlrd.XL_CELL_BOOLEAN) #4
cell = sheet.cell(1,1)
print(cell.value) #
print(cell.ctype) #0:代表空白数据类型
print(xlrd.XL_CELL_EMPTY) #0
写入Excel文件
步骤如下:
- 导入xlwt模块
- 创建一个Workbook对象
- 创建一个Sheet对象
- 使用sheet.write方法把数据写入到Sheet下指定行和列中。如果想要在原来workbook对象上添加新的cell,那么需要调用put_cell来添加
- 保存成Excel文件
import xlwt
import random
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("sheet1") #添加一张表格
headers = ['姓名','语文','数学','英语']
for index,header in enumerate(headers):
sheet.write(0,index,header)
names = ['张三','李四','王五']
for index,name in enumerate(names):
sheet.write(index+1,0,name)
for row in range(1,4):
for col in range(1,4):
sheet.write(row,col,random.randint(1,100))
workbook.save('成绩表1.xls')
编辑Excel文件
import xlwt
import xlrd
#读取
rwb = xlrd.open_workbook('成绩表.xlsx')
rsheet = rwb.sheet_by_index(0)
#求总分
rsheet.put_cell(0,4,xlrd.XL_CELL_TEXT,'总分',None) #在原有的数据上添加
nrows = rsheet.nrows #总行数
ncols = rsheet.ncols #总列数
for row in range(1,nrows):
grades = rsheet.row_values(row,1,4)
total = sum(grades)
rsheet.put_cell(row,4,xlrd.XL_CELL_NUMBER,total,None)
#求科目平均分,行数和列数会随着数据的增加而改变,所以每做一次操作读取一个行数和列数
nrows = rsheet.nrows
ncols = rsheet.ncols
for col in range(1,5):
sigle_grades = rsheet.col_values(col,1,nrows)
avg = sum(sigle_grades)/len(sigle_grades)
print(avg)
rsheet.put_cell(nrows,col,xlrd.XL_CELL_NUMBER,avg,None)
#写入,此时数据只保存在内存当中,需要进行写入操作才能完成表格的保存
wwb = xlwt.Workbook()
wsheet = wwb.add_sheet("sheet1")
nrows = rsheet.nrows
ncols = rsheet.ncols
for row in range(0,nrows):
for col in range(0,ncols):
wsheet.write(row,col,rsheet.cell_value(row,col))
wwb.save('abc.xls')
MySQL数据库处理
连接数据库
import pymysql
#1.使用pymysql.connetc()方法连接MySQL数据库
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer')
#2.如果想要操作数据库,还需要获取db上的cursor对象
cursor = db.cursor() #创建游标
#3.使用cursor.execute()来执行sql语句
cursor.execute("select * from article") #执行SQL语句
res = cursor.fetchone() #提取匹配到的第一条数据
print(res)
- host:以后在连接外网服务器的时候,就要改成外网服务器的ip地址
- port:在外网一般会更换端口号,不会为3306,这是为了安全考虑
- user:连接的用户,一般在生产环境中会单独分配
- password:这个用户的密码
- database:要连接操作的数据库名
- charset:设置为utf8,这样就能操作中文了
数据的插入操作
insert into [表名] (字) values(字段对应的值)
import pymysql
#插入数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer') #连接数据库
cursor = db.cursor()
#第一种
# sql = "insert into article(id,title,content) values(null,'wuyuli','995')"
# cursor.execute(sql) #执行
#第二种
title = 'aaa'
content = 'bbb'
sql = "insert into article(id,title,content) values(null,%s,%s)"
cursor.execute(sql,(title,content))
db.commit() #提交
db.close() #关闭
查找数据
使用pymysql查询数据,可以使用:
- fetchone():这个方法每次只获取一条数据
- fetchall():这个方法接收全部的返回结果
- fetchmany(size):可以获取指定条数的数据
import pymysql
#查找数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer') #连接数据库
cursor = db.cursor()
sql = "select id,title from article"
# sql = "select id,title from article where id>3" #查找id>3的数据
cursor.execute(sql) #执行sql语句
res = cursor.fetchone() #(1, 'abc')返回匹配到数据中的第一条
# res = cursor.fetchall() #((1, 'abc'), (2, 'wuyuli'), (3, 'aaa')) 返回全部匹配到的数据
# res = cursor.fetchmany(2) #((1, 'abc'), (2, 'wuyuli')) 返回指定条数的数据
print(res)
db.commit()
db.close()
删除数据
delete from [表名] 条件
import pymysql
#删除数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer') #连接数据库
cursor = db.cursor()
sql = "delete from article where id=3"
cursor.execute(sql)
db.commit()
db.close()
更新数据库
update [表名] 更新操作 条件
import pymysql
#更新数据
db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='csdn_crawer',charset='utf8') #charset指定字符集,插入中文时可能会出错
cursor = db.cursor()
sql = "update article set title='钢铁是怎样练成的',content='第一章' where id=2"
cursor.execute(sql)
db.commit()
db.close()