码迷,mamicode.com
首页 > 编程语言 > 详细

python中常用的模块二

时间:2018-11-15 23:42:09      阅读:388      评论:0      收藏:0      [点我收藏+]

标签:1.0   cti   not   section   inpu   led   概念   模块   exception   

一.序列化

指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化,

不同的序列化结果不同,但目的是一样的,都是为了存储和传输.

一,pickle.可以将我们python中的任意数据类型转化成bytes并写入到文件中.

同样也可以把文件中写好的bytes转换回我们的python的数据.这个过程被称为序列化

import pickle
class Cat:
 def __init__(self, name, age):
 self.name = name
 self.age = age
 def catchMouse(self):
 print(self.name, "抓??")
c = Cat("jerry", 18)
bs = pickle.dumps(c) # 序列化一个对象.
print(bs) # 一堆二进制. 看不懂
cc = pickle.loads(bs) # 把二进制反序列化成我们的对象
cc.catchMouse() # 猫依然是猫. 还可以抓老鼠
pickle中的dumps可以序列化一个对象. loads可以反序列化一个对象. 我们使用dump
还可以直接 把一个对象写入到文件中
# f = open("cat", mode="wb")
# pickle.dump(c, f) # 写到?件中
# f.close()
f = open("cat", mode="rb")
cc = pickle.load(f) # 从文件中读取对象
cc.catchMouse()

 pickle还?持多个对象的写出.

lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)]
f = open("cat", mode="wb")
for el in lst:
 pickle.dump(el, f) # 写?到?件中
f.close()
f = open("cat", mode="rb")
for i in range(len(lst)):
 cc = pickle.load(f) # 从?件中读取对象
 cc.catchMouse()
lst = [c1, c2, c3]
f = open("cat.dat", mode="ab")
pickle.dump(lst, f) # 把对象写到文件中

f = open("cat.dat", mode="rb")
lst = pickle.load(f) # 读取第一次
for cc in lst:
    cc.chi()
用户注册与登录
class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

class client:
    def regist(self):
        uname = input("please input your username:")
        pwd = input("please input your password:")
        user = User(uname, pwd)
        pickle.dump(user, open("userinfo", mode="ab"))
        print("regist successful!!!")

    def login(self):
        uname = input("please input your username:")
        pwd = input("please input your password:")
        f = open("userinfo", mode="rb")
        while 1:
            try:
                u = pickle.load(f) # 从文件里把对象拿出来
                if u.username == uname and u.password == pwd:
                    print("login successful !!")
                    break

            except Exception as e:
                print("login failed !!!")
                break

c = client()
# c.regist()
# c.regist()
# c.regist()
# c.regist()
c.login()

 三.shelve

shelve. 简单另类的一种序列化的方案. 有点?类似redis. 可以作为 一种小型的数据库来使用

shelve提供python的持久化操作就是把数据写到硬盘上. 在操作shelve的时候非常的像操作一个字典

import shelve
shelf = shelve.open("sylar")
# shelf["jay"] = "周杰伦"
print(shelf[‘jay‘])
shelf.close()

 我们存储 ?些复杂的数据 

我们存储一些复杂的数据
s = shelve.open("sylar")
# s["jay"] = {"name":"周杰伦", "age":18, "hobby":"哄?孩"}
print(s[‘jay‘])
s.close()
修改时注意需添加参数writeback=True
s = shelve.open("sylar", writeback=True)
s[‘jay‘][‘name‘] = "胡辣汤" # 尝试改变字典中的数据
s.close()
s = shelve.open("sylar")
print(s[‘jay‘]) # 改变了.
s.close()

writeback=True可以动态的把我们修改的信息写入到文件中还可以删
除数据. 就像字典?样. 
s = shelve.open("sylar", writeback=True)
del s[‘jay‘]
s.close()

s = shelve.open("sylar")
print(s[‘jay‘]) # 报错了, 没有了
s.close()

s = shelve.open("sylar", writeback=True)
s[‘jay‘] = "周杰伦"
s[‘wlj‘] = "王力宏"
s.close()

s = shelve.open("sylar")
for k in s: # 像字典一样遍历
     print(k)
print(s.keys()) # 拿到所有key的集合
for k in s.keys():
     print(k)
for k, v in s.items(): # 像字典一样操作
     print(k, v)
s.close()

 四. json(重点) 

概念  json. 将python中常用的字典, 列表转化成字符串. 是目前前后端数据交互使用频率 最高的一种数据格式.

json是我们前后端交互的枢纽. 相当于编程界的普通话. 大家沟通都用 json.因为json的语法格式可以完美的表示出一个对象.

json全 称javascript object notation. 翻译过来叫js对象

wf = {
    "name":"汪峰",
     "age":18,
     "hobby":"上头条",
     "wife":{
            "name":‘?怡‘,
             "age":19,
 "hobby":["唱歌", "跳舞", "演戏"]
 }

  用xml写

<?xml version="1.0" encoding="utf-8" ?>
<wf>
     <name>汪峰</name>
    <age>18</age>
     <hobby>上头条</hobby>
     <wife>
            <name>子怡</name>
            <age>18</age>
             <hobbies>
                     <hobby>唱歌</hobby>
                     <hobby>跳舞</hobby>
                     <hobby>演戏</hobby>
              </hobbies>
       </wife>

</wf>

  json案例

import  json
例一
# 准备一个字典
dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None}
# python中可以直接把字典或者列表转化成json
s = json.dumps(dic, ensure_ascii=False)  # pickle
print(type(s))
print(s)
例二
s = ‘{"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": false, "e": null}‘
d = json.loads(s) # 把json转化成字典
print(d)
print(type(d))


例三
dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None, "wf":{"name":"半壁江山", "hobby":"皮裤"}}
f = open("sylar.json", mode="w", encoding="utf-8")
json.dump(dic, f, ensure_ascii=False, indent=4) # 4个空格 = 1个tab

f = open("sylar.json", mode="r", encoding="utf-8")
d = json.load(f)
print(d)
例四
class Person:
    def __init__(self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName

s = ‘{"firstName": "尼古拉斯", "lastName": "刘能"}‘
def func(dic):
    return Person(dic[‘firstName‘], dic["lastName"])
p = json.loads(s, object_hook=func) # 通过函数func把字典转换回对象
print(p.firstName, p.lastName)
p = Person("尼古拉斯", "刘能")
例五
#把对象转换成json
s = json.dumps(p.__dict__, ensure_ascii=False) # 方案一, 转的是字典
def func(obj):
    return {
        "firstName": obj.firstName,
        "lastName": obj.lastName
    }
s = json.dumps(p, default=func, ensure_ascii=False) # 方案二 转化的也是字典
print(s)
例六
dic1 = {"name":‘毒液‘, "评分": "0.9"}
dic2 = {"name":‘与神同行‘, "评分": "10"}
dic3 = {"name":‘看不见的客人‘, "评分": "9.5"}
lst = [dic1, dic2, dic3]
f = open("movie.json", mode="w", encoding="utf-8")
for d in lst:
    s = json.dumps(d, ensure_ascii=False)
    f.write(s+"\n")

f = open("movie.json", mode="r", encoding="utf-8")
dic1 = json.load(f) # 当json文件中保存多个json的时候不能一次性全部都读取出来
print(dic1)

f = open("movie.json", mode="r", encoding="utf-8")
for line in f:
    line = line.strip()
    if line == "":
        continue
    else:
        d = json.loads(line) # 一行一行的处理
        print(d)

 五 configparser模块

该模块适?于配置?件的格式与windows ini文件类似,可以包含一个或多个节(section)每个节 可以有多个参数(键=值). 首先, 我们先看一个xxx服务器的配置文件

import configparser
config = configparser.ConfigParser() # 创建对象

config[‘DEFAULT‘] = {  # 特殊
    "name":"腾讯qq木马",
    "time":"qq更新时间",
    "version":"1.0"
}
config[‘SERVER_1‘] = {
    "IP":"192.168.1.123",
    "port":"12306"
}
config[‘SERVER_2‘] = {
    "IP":"192.168.1.178",
    "port":"12311"
}
config[‘SERVER_3‘] = {
    "IP":"192.168.1.176",
    "port":"12312"
}

# 写入到文件
config.write(open("qq.ini", mode="w", encoding="utf-8"))


# 读取内容
config = configparser.ConfigParser()
# 读取内容
config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config
print(config[‘SERVER_1‘][‘IP‘]) # 字典
print(config[‘SERVER_2‘][‘name‘])
print(config.get("SERVER_3", "IP")) # 字典

for k, v in config[‘DEFAULT‘].items():
    print(k, v)

# config = configparser.ConfigParser()
# # 读取内容
# config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config
# config[‘SERVER_1‘][‘NAME‘] = "哈哈哈"
# config.write(open("qq.ini", mode="w", encoding="utf-8"))

 

# 先读取. 然后修改. 最后写回文件
config = configparser.ConfigParser()
config.read("db.ini") # 读取文件
# 添加一个章节
# config.add_section("189-DB")
# config["189-DB"] = {
# "db_ip": "167.76.22.189",
# "port": "3306",
# "u_name": "root",
# "u_pwd": "123456"
# }
# 修改信息
config.set("168-DB", "db_ip", "10.10.10.168")
# 删除章节
config.remove_section("173-DB")
# 删除元素信息
config.remove_option("168-DB", "u_name")
# 写回文件
config.write(open("db.ini", mode="w"))

  

python中常用的模块二

标签:1.0   cti   not   section   inpu   led   概念   模块   exception   

原文地址:https://www.cnblogs.com/liucsxiaoxiaobai/p/9966814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!