2-3.数据存储篇

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值