数据储存
JSON
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON支持对象(字典)、数组(列表)、整数、浮点数、布尔类型、null类型还有字符串类型等。多个数据之间使用逗号分开。
注意:字符串内容必须使用双引号,(不能使用单引号),且json本质就是一个字符串。
我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling;序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上;反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
######存储json######
import json
dic = {"name":"Hermaeus",
"age":19,
"hometown":"MeiShan",
"hobby":"Coding"}
j_dic = json.dumps(dic) #===> json.dump(dic, f)
f = open("test.json","w")
f.write(j_dic)
f.close()
######加载json######
import json
######存储json######
f = open("test.json","r")
date = json.loads(f.read()) #===> json.load(f)
print(date)
输入结果为:
{'name': 'Hermaeus', 'age': 19, 'hometown': 'MeiShan', 'hobby': 'Coding'}
注意:json在打印dump
的时候,只能存放ASCII的字符,因此会将其中中文等字符进行转义,这是我们可以在传递ensure_ascii=False
这个参数来关闭这个特性。
CSV文件处理
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。
写入
方法一
这种方法,我们需要创建一个writer
对象。之后,我们可以使用writerow
写入一行,或者使用writerows
写入多行。例如:
import csv
headers = ["name","age","hometown"]
values = [
("Mingle",20,"MeiShan"),
("ZhangYi",19,"Chengdou"),
("Zhaoli",16,"NanJing")
]
with open("text.csv","w",newline="") as fp:
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)
这样就生成了一个叫做text.csv
的文件,如下:
name,age,hometown
Mingle,20,MeiShan
ZhangYi,19,Chengdou
Zhaoli,16,NanJing
方法二
我们也可以使用字典的方式把数据写入,这时我们必须借助DictWriter
了,例如:
import csv
headers = ["name","age","hometown"]
values = [
{"name":"Mingle","age":20,"hometown":"Meishan"},
{"name": "Aaa", "age": 17, "hometown": "NanJing"},
{"name": "Mm", "age": 21, "hometown": "ShangHai"}
]
with open("text_1.cvs","w",newline="") as fp:
writer = csv.DictWriter(fp,headers)
writer.writeheader() ##虽然已经传入了headers,但是在这里依然要使用该方法写入headers
writer.writerows(values)
读取
方法一
import csv
with open("text.csv","r") as fp:
reader = csv.reader(fp)
tiltles = next(reader)
print(tiltles)
for i in reader:
print(i)
方法二
我们通过DictReader
类来实例一个对象,可以返回字典类型。
import csv
with open("text.csv","r") as fp:
reader = csv.DictReader(fp)
for x in reader:
print(x)
'''
result:
OrderedDict([('name', 'Mingle'), ('age', '20'), ('hometown', 'MeiShan')])
OrderedDict([('name', 'ZhangYi'), ('age', '19'), ('hometown', 'Chengdou')])
OrderedDict([('name', 'Zhaoli'), ('age', '16'), ('hometown', 'NanJing')])
'''
MySQL
与pymysql
连接
import pymysql
db = pymysql.connect(
host = "localhost", ##地址
user = "root",
password = "######",
db = "mysql",
port = 3306 ##端口默认3306
)
cursor = db.cursor() ##获取游标
cursor.execute("select * from info") ##执行命令
data = cursor.fetchone() ##获取数据
print(data)
db.close() ##关闭数据库
插入数据
import pymysql
db = pymysql.connect(
host = "localhost",
user = "root",
password = "yuanming88",
db = "text",
port = 3306
)
cursor = db.cursor()
sql = """
insert into info(id,name,age,hometown) values(02,'aa',18,"Chengduo")
"""
cursor.execute(sql)
db.commit() ##必须要提交
db.close()
另一种方法:
import pymysql
db = pymysql.connect(
host = "localhost",
user = "root",
password = "yuanming88",
db = "text",
port = 3306
)
cursor = db.cursor()
sql = """
insert into info(id,name,age,hometown) values(%s,%s,%s,%s)
"""
cursor.execute(sql,(3,"bbb",21,"NanJing")) ##如果不确定值,可以这样传入
db.commit()
db.close()
查找数据
有如下方法:
fetchone()
:这个方法每次只会获取一条数据
import pymysql
db = pymysql.connect(
host = "localhost",
user = "root",
password = "yuanming88",
db = "text",
port = 3306
)
cursor = db.cursor()
cursor.execute("select * from info")
data = cursor.fetchone()
print(data)
db.close()
'''
result:
(1, 'Mingle', 20, 'MeiShan')
'''
fetchall()
:会接收的所有返回结果
import pymysql
db = pymysql.connect(
host = "localhost",
user = "root",
password = "yuanming88",
db = "text",
port = 3306
)
cursor = db.cursor()
cursor.execute("select * from info")
data = cursor.fetchall()
print(data)
db.close()
'''
result:
((1, 'Mingle', 20, 'MeiShan'), (2, 'aa', 18, 'Chengduo'), (3, 'bbb', 21, 'NanJing'))
'''
fetchmany(n)
:可以返回指定数量的数据
import pymysql
db = pymysql.connect(
host = "localhost",
user = "root",
password = "yuanming88",
db = "text",
port = 3306
)
cursor = db.cursor()
cursor.execute("select * from info")
data = cursor.fetchmany(2)
print(data)
db.close()
'''
reslut:
((1, 'Mingle', 20, 'MeiShan'), (2, 'aa', 18, 'Chengduo'))
'''
删除数据
import pymysql
db = pymysql.connect(
host = "localhost",
user = "root",
password = "yuanming88",
db = "text",
port = 3306
)
cursor = db.cursor()
cursor.execute("delete from info where id=3")
db.commit()
db.close()
更新数据
import pymysql
db = pymysql.connect(
host = "localhost",
user = "root",
password = "yuanming88",
db = "text",
port = 3306
)
cursor = db.cursor()
cursor.execute("update info set name = 'cc' where id = 1")
db.commit()
db.close()
MongoDB
和pymongo
建立连接
import pymongo
client = pymongo.MongoClient("localhost",27017) ##传入地址和端口就够了
db_list = client.list_database_names() ##该方法是打印数据库列表
print(db_list)
插入
insert_one
方法
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test'] ##先获取该集合
mycol = mydb['subtest']
mydict = {
'name':'MM',
'age':13,
'hometown':'BeiJing'
}
mycol.insert_one(mydict)
insert_many
方法
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
mydict = [
{'name':"YY",'age':19,'hometown':'ShangHai'},
{'name':'BB','age':20,'hobby':"reading"},
{'name':'GG','age':16,'sex':'male'}
]
mycol.insert_many(mydict)
当然,我们也可以自己指定_id
。
数据查询
find_one
方法
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
rep = mycol.find_one()
print(rep)
#{'_id': ObjectId('5cb474f9839d11a1a366c66b'), 'name': 'yuan'}
find()
方法
该方法是查询集合中所有的数据
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
rep = mycol.find()
for r in rep:
print(r)
'''
result:
{'_id': ObjectId('5cb474f9839d11a1a366c66b'), 'name': 'yuan'}
{'_id': ObjectId('5cb47545839d11a1a366c66c'), 'name': 'LiSa', 'age': 18.0, 'hometown': 'Chengduo'}
{'_id': ObjectId('5cb4921534ddc820d0822c79'), 'name': 'MM', 'age': 13, 'hometown': 'BeiJing'}
{'_id': ObjectId('5cb4941034ddc83720aeb5a7'), 'name': 'YY', 'age': 19, 'hometown': 'ShangHai'}
{'_id': ObjectId('5cb4941034ddc83720aeb5a8'), 'name': 'BB', 'age': 20, 'hobby': 'reading'}
{'_id': ObjectId('5cb4941034ddc83720aeb5a9'), 'name': 'GG', 'age': 16, 'sex': 'male'}
'''
筛选
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
rep = mycol.find({},{'_id':0,'name':1,'age':1})
##1指定显示,反之这不现实,_id要单独设置关闭
for r in rep:
print(r)
'''
result:
{'name': 'yuan'}
{'name': 'LiSa', 'age': 18.0}
{'name': 'MM', 'age': 13}
{'name': 'YY', 'age': 19}
{'name': 'BB', 'age': 20}
{'name': 'GG', 'age': 16}
'''
- 根据条件查询
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
rep = mycol.find({'age':20}) ##指定查询age为20的数据
for r in rep:
print(r)
'''
result:
{'_id': ObjectId('5cb4941034ddc83720aeb5a8'), 'name': 'BB', 'age': 20, 'hobby': 'reading'}
'''
- 指定条数查询
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
rep = mycol.find().limit(3) #指定只查询前3条数据
for r in rep:
print(r)
'''
result:
{'_id': ObjectId('5cb474f9839d11a1a366c66b'), 'name': 'yuan'}
{'_id': ObjectId('5cb47545839d11a1a366c66c'), 'name': 'LiSa', 'age': 18.0, 'hometown': 'Chengduo'}
{'_id': ObjectId('5cb4921534ddc820d0822c79'), 'name': 'MM', 'age': 13, 'hometown': 'BeiJing'}
'''
- 修饰符查询
$all
:匹配那些指定键的键值中包含数组,而且该数组包含条件指定数组的所有元素的文档。{field: { $all: [ <value> , <value1> ... ] }
$gt
:匹配键值大于指定值的所有文档。{field: {$gt: value} }
$gte
:匹配键值不小于指定值的所有文档。{field: {$gte: value} }
$lt
:匹配键值小于指定值的所有文档。{field: {$lt: value} }
$lte
:匹配键值不大于指定值的所有文档。{field: {$lte: value} }
$in
:匹配键值等于指定数组中任意值的文档。{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }
$nin
:匹配键不存在或者键值不等于指定数组的任意值的文档。{ field: { $nin: [ <value1>, <value2> ... <valueN> ]} }
$ne
:匹配键值不等于指定值的文档。{field: {$ne: value} }
$and
:and指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
$nor
:$nor执行逻辑NOR运算,指定一个至少包含两个表达式的数组,选择出都不满足该数组中所有表达式的文档。{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
$not
:$not执行逻辑NOT运算,选择出不能匹配表达式的文档 ,包括没有指定键的文档。{ field: { $not: { <operator-expression> } } }
$or
:$or执行逻辑OR运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
rep = mycol.find({"age":{'$lte':16}})
for r in rep:
print(r)
'''result:
{'_id': ObjectId('5cb4921534ddc820d0822c79'), 'name': 'MM', 'age': 13, 'hometown': 'BeiJing'}
{'_id': ObjectId('5cb4941034ddc83720aeb5a9'), 'name': 'GG', 'age': 16, 'sex': 'male'}
'''
正则表达式查询
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
rep = mycol.find({"name":{'$regex':'^[yY]'}}) #我们需要使用$regex来指定
for r in rep:
print(r)
方法一:使用update_one
,修改一条数据
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
upd = {'name':'yuan'} ##设定修改的范围条件
upd_v = {'$set':{'name':'Zz'}} ##使用$set关键字修改
mycol.update_one(upd,upd_v)
方法二:使用update_many
,修改多条信息
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
upd = {'name':{'$regex':'^[yY]'}} ##设定修改的范围条件
upd_v = {'$set':{'age':22}}
mycol.update_one(upd,upd_v)
删除
方法一:我们可以使用delete_one()
方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
de_v = {"name":"Zz"} ##指定删除的条件
mycol.delete_one(de_v)
方法二:我们可以使用delete_many
来删除多个值
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
de_v = {"name":{"$regex":"^[BG]"}}
mycol.delete_many(de_v)
删除集合:
import pymongo
client = pymongo.MongoClient("localhost",27017)
mydb = client['test']
mycol = mydb['subtest']
mycol.drop()
排序
sort()
方法第一个参数为要排序的字段,第二个字段指定排序规则,1为升序,-1为降序,默认为升序。
import pymongo
myclient = pymongo.MongoClient("localhost",27017)
mydb = myclient["test"]
mycol = mydb["subtest"]
mydoc = mycol.find().sort("alexa", -1)
for x in mydoc:
print(x)