JSON
JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,它通过对象和数组的组合来表
示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。本节中,我们就来了解如何
利用 Python 保存数据到 JSON 文件。
w 写, r 读, a 追加;
最好是处理好数据一次写入
import json
import os
data = [{
'name': ' 王伟 ',
'gender': ' 男 ',
'birthday': '1992-10-18'
}]
#文件名
filename = 'data.json'
if os.path.exists(filename) is False:
with open(filename, 'w', encoding='utf-8') as file:
file.write(json.dumps(data, indent=2, ensure_ascii=False))
else:
print('文件已存在')
CSV
CSV,全称为 Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形
式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每
条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都
有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比 Excel 文件更加简洁,XLS 文本是电
子表格,它包含了文本、数值、公式和格式等内容,而 CSV 中不包含这些内容,就是特定字符分隔的纯
文本,结构简单清晰。所以,有时候用 CSV 来保存数据是比较方便的。本节中,我们来讲解 Python 读
取和写入 CSV 文件的过程。
导包
import csv
#单行写入writerow
with open('data.csv','w') as csvfile:
#默认会有空行
#fieldnames不想显示空行加
writer = csv.writer(csvfile,fieldnames=fieldnames)
#表头
writer.writerow(['id', 'name', 'age'])
#内容
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])
writer.writerow(['10003', 'Jordan', 21])
#多行写入writerows
data =[
['10001', '邓刚', 20],
['10002', '聂小雨', 22],
['10003', '李大毛', 21]
]
with open('data.csv', 'w',encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
#表头
writer.writerow(['id', 'name', 'age'])
#内容
writer.writerows(data)
保存Excel格式文件
from openpyxl import Workbook
import random
import pandas #pip install pandas
wb = Workbook()
ws = wd.create_sheet('表1',index=0)
ws.append(['编号','名称','年龄'])
for i in range(10):
id = str(i)
name = ("大乔"+str(i))
age = random.randint(18,30)
ws.append([id,name,age])
wb.save('xx.xlsx')
MySQL
关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行
列组成的表,每一列是一个字段,每一行是一条记录。表可以看作某个实体的集合,而实体之间存在联
系,这就需要表与表之间的关联关系来体现,如主键外键的关联关系。多个表组成一个数据库,也就是
关系型数据库。
关系型数据库有多种,如 SQLite、MySQL、Oracle、SQL Server、DB2 等
连接数据库
import pymysql
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)
cursor = db.cursor() # 游标
cursor.execute('SELECT VERSION()')
data = cursor.fetchone()
print('Database version:', data)
cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")
db.close()
创建数据表
import pymysql
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
cursor.execute(sql)
db.close()
插入数据
import pymysql
id = '20220315'
user = '菲菲'
age = 20
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'INSERT INTO students(id, name, age) values(% s, % s, % s)'
try:
cursor.execute(sql, (id, user, age))
db.commit()
except:
db.rollback()
db.close()
字典数据插入
import pymysql
data = { 'id':'20220315', 'name': '菲菲', 'age': 20 }
keys = ', '.join(data.keys())
values = ', '.join(['% s'] * len(data))
sql = 'INSERT INTO students({keys}) VALUES ({values})'.format( keys=keys, values=values)
try:
if cursor.execute(sql, tuple(data.values())):
print('Successful')
db.commit()
except:
print('Failed')
db.rollback()
db.close()
非关系型数据库
MongoDB
MongoDB简介
MongoDB 是由 C++ 语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内
容存储形式类似 JSON 对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节
中,我们就来看看 Python 3 下 MongoDB 的存储操作。
连接 MongoDB
连接 MongoDB 时,我们需要使用 PyMongo 库里面的 MongoClient。一般来说,传入 MongoDB 的 IP
及端口即可,其中第一个参数为地址 host,第二个参数为端口 port(如果不给它传递参数,默认是
27017)
import pymongo
# 如果是云服务的数据库 用公网IP连接
client = pymongo.MongoClient(host='localhost', port=27017)
#指定数据库和表
db = client.test
collection = db['students'] # 都可以
import httpx
def get_data():
res = httpx.get('网址')
# 数据变字典格式
items = res.json()
item = items.get('Data')['Posts'] # 列表形式
for i in item:
if isinstance(i,dict):
#插入数据
collection.insert_one(i)
get_data()
Elasticsearch 搜索引擎存储 (性能优秀)
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于
RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是
一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安
装使用方便
重要特性:
分布式的实时文件存储,每个字段都被索引并可被搜索
实时分析的分布式搜索引擎
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
基本概念:
索引(indices)-------------------Databases 数据库
类型(type)----------------------Table 数据表
文档(Document)---------------Row 行
字段(Field)---------------------Columns 列
详细说明:
要注意的是:Elasticsearch 本身就是分布式的,因此即便你只有一个节点,Elasticsearch 默认也会对你
的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡
创建和删除索引库
from elasticsearch import Elasticsearch
#建立链接
es = Elasticsearch()
#创建库
result = es.indices.create(index='库名必须唯一不然报错', ignore=400)
#删除库
es.indices.delete(index='news')
print(result)
添加数据
from elasticsearch import Elasticsearch
es = Elasticsearch()
data = {
'title':'路漫漫其修远兮,吾将上下而求索',
'url':'网址'
}
es.index(index="xl",doc_type="test_type",id=2,body=data)
查询数据
result = es.search(index="xl")
for item in result["hits"]["hits"]:
print(item["_source"])
插入多条数据
data = [{
'title':'路漫漫其修远兮,吾将上下而求索',
'url':'网址',
},{
'title':'路漫漫其修远兮,吾将上下而求索',
'url':'网址',
},{
'title':'路漫漫其修远兮,吾将上下而求索',
'url':'网址',
},{
'title':'路漫漫其修远兮,吾将上下而求索',
'url':'网址',
}]
for da in data:
es.index(index='my_index2',doc_type='text',body=da)
查询
res = es.search(index="库名")
print(res)
过滤查询
dsl = {
'query':{
'match':{
'title':'路漫漫 求索'
}
}
}
res1 = es.search(index='my_index2',body=dsl)
print(res1)