学习笔记:Python 面试100讲(基于Python3.x)04-数据存储

本章很多都是应用类的,实际中用多点就好。操作数据库的话都大同小异。

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值