本章很多都是应用类的,实际中用多点就好。操作数据库的话都大同小异。
01-读取xml节点和属性值
一 在files目录中有一个products.xml文件,要求读取该文件中products节点的所有子节点的值以及子节点的属性值
xml文件内容如下:
<root>
<products>
<product uuid="1234">
<id>1000</id>
<name>iphone9</name>
<price>9999</price>
</product>
<product uuid="4321">
<id>2000</id>
<name>特斯拉</name>
<price>8888</price>
</product>
<product uuid="4321">
<id>3000</id>
<name>Mac Pro</name>
<price>7777</price>
</product>
</products>
</root>
答:
# 下面这个模块是python内置模块
# parse是用于分析xml的函数
from xml.etree.ElementTree import parse
doc = parse("products.xml")
print(type(doc))
# 输出<class 'xml.etree.ElementTree.ElementTree'>
# iterfind函数后面的参数要输入节点的层次结构,然后它可以返回所有这些节点的数据
print(type(doc.iterfind("products/product")))
# 返回的是生成器类型<class 'generator'>
for item in doc.iterfind("products/product"):
#findtext是搜索节点文本用的函数
id = item.findtext("id")
name = item.findtext("name")
price = item.findtext("price")
# 获取节点属性用get函数
uuid = item.get("uuid")
print(f"uuid={uuid},id={id},name={name},price={price}")
print("----------------------------------------------")
02-xml与字典之间的互相转换
一 如何将一个字典转换成xml文档,并将该xml文档保存成文本文件
二 如何读取xml文件的内容,并将其转换成字典
答:
就是用dicttoxml模块把字典转换成xml
用xmltodict模块把xml转换成字典
一
'''
需要先安装dicttoxml模块
pip install dicttoxml
'''
import dicttoxml
from xml.dom.minidom import parseString # 分析字符串把xml文档格式变漂亮用的
d = ["abc", 234, {"name": "Bill", "age": 23, "salary": 5000},
{"name": "Mike", "age": 123, "salary": 6000},
{"name": "Jessica", "age": 234, "salary": 7000}]
# 第一个参数可以是列表或者字典,custom_root是根节点
bxml = dicttoxml.dicttoxml(d, custom_root="persons")
xml = bxml.decode("utf-8") # 解码,暂不知道为什么要解码
print(xml)
dom = parseString(xml) # 分析这串字符串
# 下面的indent参数貌似是换行之后的空格,每深入一级时开头空多少格
prettyxml = dom.toprettyxml(indent=' ')
print(prettyxml)
# 存进xml文档里
f = open("person1.xml", "w", encoding="utf-8")
f.write(prettyxml) # 把原来内容删除,写进去prettyxml
f.close()
二
'''
需要先安装xmltodict
'''
import xmltodict
import pprint
f = open("products.xml", "rt", encoding="utf-8")
xml = f.read()
d = xmltodict.parse(xml)
print(d)
# 下面就是把格式弄漂亮的意思,唉
pp = pprint.PrettyPrinter(indent=1)
pp.pprint(d)
03-将JSON字符串转换成类的实例
一 如何将json文档映射为一个对象
json文件内容如下:
{
"name": "iPhone9",
"price": 9999,
"count": 3000
}
答:
json模块的loads函数可以装载json文档,并将其转换为json对象.
关键需要通过object_hook参数指定钩子对象,然后在类的构造方法中将传入的JSON对象赋给内部变量__dict__
# 导入分析json的模块
import json
class Product:
def __init__(self, d):
# 使用__dict__可以直接把字典映射成函数属性
self.__dict__ = d
f = open("product.json", "r")
jsonstr = f.read()
#下面一行的操作包含了两步
#一个是把jsonstr转换成字典
#另一个是后面的对象钩子会创建对象,同时把转换后的字典传入对象的形参
product = json.loads(jsonstr,object_hook=Product)
# 查看product类型,没加对象钩子显示为字典,加了后显示为相应的对象
print(type(product))
#已经传入了
print(product.name)
#下面是一个转换函数,相当于一个中间商了
#我猜对象钩子就是单纯把参数传进去吧
def product2(d):
return Product(d)
product1 = json.loads(jsonstr,object_hook=product2)
print(product1.name)
f.close()
04-将类的实例转换为json字符串
一 将一个对象转换为对应的JSON字符串
二 将对象列表转换为JSON字符串
附件:products.json文件,内容如下:
[
{
"name": "iPhone9",
"price": 9999,
"count": 3000
},
{
"name": "特斯拉",
"price": 8888,
"count": 8000
}
]
答:
json模块的dumps函数用于将对象(字典)转换为JSON字符串,
通过default参数指定一个转换函数,可以在该函数中提取对象的属性值,并生成JSON数据,
最后dumps负责将转换函数返回的数据转换为JSON字符串
一
import json
class Product:
def __init__(self, name, price, count):
self.name = name
self.price = price
self.count = count
# 转换函数
def product2Dict(obj):
return {
"name": obj.name,
"price": obj.price,
"count": obj.count
}
product = Product("特斯拉", 20000, 20)
# 应该是把对象传入相应的default参数,把对象里的属性形成一个新的字典,接着简单的dumps
# ensure_ascii如果等于True一些字符会输出ascii码
jsonStr = json.dumps(product, default=product2Dict, ensure_ascii=False)
print(jsonStr)
二
# 下面一系列操作是先创建一个对象列表,可以看做是json数据列表转换成对象列表的实操
class Product:
def __init__(self, d):
self.__dict__ = d
f = open("products.json", "r", encoding="utf-8")
jsonStr = f.read()
# 貌似如果是字典列表的话,loads函数会遍历迭代一个个地传入对象钩子
products = json.loads(jsonStr, object_hook=Product)
# 输出一个对象列表,即products是我们创建的对象列表
print(products)
f.close()
# 貌似如果是字典列表的话,dumps函数会遍历迭代一个个地传入default参数的转换函数
# default和一里面的转换函数一样
jsonStr = json.dumps(products, default=product2Dict, ensure_ascii=False)
print(type(jsonStr)) # 输出格式,为字符串
05-操作SQLite数据库
一 如何创建SQLite数据库
二 如何向SQLite表中插入数据
三 如何查询SQLite表中的数据
答:
使用python内置的sqlite3模块中的API可以操作SQLite数据库
一
# 创建数据库和表
import sqlite3
import os
dbPath = 'data.sqlite'
if not os.path.exists(dbPath):
conn = sqlite3.connect(dbPath)
c = conn.cursor()
c.execute('''create table persons
(id int primary key not null,
name text not null,
age int not null,
address char(100),
salary real);''')
conn.commit()
conn.close()
print('数据库创建成功')
二
#插入数据
conn = sqlite3.connect(dbPath)
c = conn.cursor()
c.execute('delete from persons')
c.execute('''insert into persons(id, name,age,address,salary)
values(1,"Bill",32,"DongGuan",20000)''')
c.execute('''insert into persons(id, name,age,address,salary)
values(2,"Mike",23,"Guangzhou",30000)''')
conn.commit()
print('insert success')
三
#查找数据
#接第二题代码
persons = c.execute('select name,age,address,salary from persons order by age')
#查看persons类型,是cursor类型
print(type(persons))
#把数据传入列表
result = []
for person in persons:
value = {}
value['name'] = person[0]
value['age'] = person[1]
value['address'] = person[2]
result.append(value)
conn.close()
print(result)
06-操作MySQL数据库
一 如何创建MySQL数据表
二 如何向MySQL表中插入数据
三 如何查询MySQL中的数据
答:
每个连接模块都差不多,就是连接后对cursor进行操作,具体操作语句是sql语句,
每次改变数据库的操作都要commit
一
'''
python中操作MySQL的模块很多,比如mysql-connector-python等
(我以前是用mysql-connector-python的,看了视频觉得pymysql名称短,也不错)
这里使用pymysql模块作示例
首先安装该模块
pip install pymysql
'''
from pymysql import *
def connectDB():
# 创建连接,视频里还专门弄了这个函数,虽说无伤大雅,感觉有点鸡肋
#127……那个IP表示本机,root是账户名,123456是该账户密码,test是数据库名称,charset是解码方式
db = connect("127.0.0.1", 'root', '123456', 'test', charset='utf8')
return db
db = connectDB()
def creatTable(db):
c = db.cursor()
try:
c.execute('''create table if not exists persons
(id int primary key not null,
name text not null,
age int not null,
address char(100),
salary real);''')
db.commit()
return True
except:
db.rollback()
return False
if creatTable(db):
print('create table success')
else:
print('create table failed')
二
# 插入数据
def insertRecord(db):
c = db.cursor()
try:
c.execute('''insert into persons(id, name,age,address,salary)
values(1,"Bill",32,"DongGuan",20000)''')
c.execute('''insert into persons(id, name,age,address,salary)
values(2,"Mike",23,"Guangzhou",30)''')
db.commit()
return True
except Exception as e:
print(e)
db.rollback()
return False
if insertRecord(db):
print("成功插入")
else:
print("插入失败")
三
# 查找数据
def selectRecord(db):
c = db.cursor()
sql = 'select name,age,salary from persons order by age desc'
c.execute(sql)
# 获取所有符合条件的数据,results是一个元组
results = c.fetchall()
# 把获得的数据搞成json字符串(先存成字典然后dumps成字符串,前面学过)
fields = ['name', 'age', 'salary']
records = []
for row in results:
records.append(dict(zip(fields, row)))
import json
return json.dumps(records)
print(selectRecord(db))
db.close()
07-ORM框架
一 在python语言中有哪些常用的ORM框架,他们有什么区别
二 如何使用SQLObject框架操作MySQL数据库
答:
一
ORM是把数据库映射成python对象来进行操作的框架
常用的有两种,都需要先pip安装
1.SQLAlchemy:偏向于SQL,可以灵活地提交SQL语句
2.SQLObject:更加面向对象,无法自由使用原生的SQL语句
二
# 先pip安装sqlobject
from sqlobject import *
# 连接数据库
# root用户名,123456用户密码,localhost:3306本地3306端口(数据库的端口),tes数据库名字,charset解码方式
mysql = 'mysql://root:123456@localhost:3306/test?charset=utf8'
# driver好像是底层一样是pymysql支持
sqlhub.processConnection = connectionForURI(mysql, driver='pymysql')
class Person(SQLObject):
class sqlmeta:
table = 't_persons'
name = StringCol(length=30)
age = IntCol()
address = StringCol(length=30)
salary = FloatCol()
try:
# 因为在上一节中创建了数据库表,所以先删了
Person.dropTable()
except:
pass
#创建数据表
Person.createTable()
print('成功创建了t_persons表')
# 插入记录
# 创建对象就是插入数据
person1 = Person(name='Bill', age=55, address='地球', salary=1234)
person2 = Person(name='Mike', age=65, address='月球', salary=4321)
person3 = Person(name='Jolin', age=22, address='火星', salary=4000)
print('成功插入三条记录')
#修改数据,直接把对象属性值修改就行了
person2.name = '李宁'
#查询表数据
persons = Person.selectBy(name = 'Bill')
print(persons[0])
#删除数据,删除Bill的数据
persons[0].destroySelf()
08-将xml文档保存在MongoDB数据库中
一 什么是NoSQL数据库,有哪些类型的NoSQL数据库,
请说出这些数据库的典型产品,以及每个类型的NoSQL数据库的适用场景
二 将XML文档保存到MongoDB数据库中,并查询文档中的数据
products.xml文档数据如下:
<root>
<products>
<product uuid="1234">
<id>1000</id>
<name>iphone9</name>
<price>9999</price>
</product>
<product uuid="4321">
<id>2000</id>
<name>特斯拉</name>
<price>8888</price>
</product>
<product uuid="4321">
<id>3000</id>
<name>Mac Pro</name>
<price>7777</price>
</product>
</products>
</root>
答:
一
NoSQL = Not only SQL,NoSQL是除了关系型数据库以外的所有数据库
1.键值数据库(key-value)数据库
Redis、Riak、Memcached
适用场景:用来存储用户信息,比如会员、配置文件、参数、购物车等。
2.文档(Document-Oriented)数据库
MongoDB、CouchDB、RavenDB
适用场景:日志、分析数据
3.列存储数据库
HBase、Cassandra
适用场景:日志、博客平台。标签可以存储到一列,类别可以存储到另一列,文章可以存储在另外一列。
4.图数据库
Neo4J、OrientDB
适用场景:
(1)在一些关系强的数据库可以使用
(2)推荐引擎
二
'''
先启动MongoDB数据库
pip install pymongo
'''
from pymongo import *
Client = MongoClient()
db = Client.data
products = db.products
# 防止现在每次调试插入数据过多,可以先删除
# 删除price大于0的数据
products.delete_many({'price':{'$gt':0}})
#读取xml文档
import xmltodict
f = open('products.xml','rt',encoding='utf-8')
xml = f.read()
f.close()
d= xmltodict.parse(xml)
productList = d['root']['products']['product']
print(productList)
#迭代,然后插入MongoDB中
for product in productList:
product['price'] = int(product['price'])
productId = products.insert_one(product).inserted_id
print(productId)
#查找price大于10000的数据并输出
for product in products.find({'price':{'$gt':10000}}):
print(product)