一、pickle(重点)
pickle用起来很简单,说白了,就是把我们的python对象写入到文件中的一种解决方案,但是写入到文件的是bytes,所以这东西不是给别人看的,是给机器看的。
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() #jerry 抓老鼠
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()
这里记住, 不能一行一行的读. 那真的要写入或者读取多个内容怎么办? 很简单. 装list里. 然后读取和写入都用list
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] f = open("cat", mode="wb") pickle.dump(lst, f) f = open("cat", mode="rb") ll = pickle.load(f) for el in ll: el.catchMouse()
记住一点, pickle序列化的内容是二进制的内容(bytes) 不是给人看的.
二、shelve
shelve提供python的持久化操作. 什么叫持久化操作呢? 说白话,就是把数据写到硬盘上。在操作shelve的时候非常的像操作一个字典. 这个东西到后期. 就像redis差不多.
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()
但是, 有坑
s = shelve.open("sylar") s['jay']['name'] = "胡辣汤" # 尝试改变字典中的数据 s.close() s = shelve.open("sylar") print(s['jay']) # 并没有改变 s.close()
解决方案
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()
综上shelve就当成字典来⽤就⾏了. 它比redis还简单.......
三、json(重点)
json是我们前后端交互的枢纽. 相当于编程界的普通话. 大家沟通都用json. 为什么这样呢? 因为json的语法格式可以完美的表示出一个对象. 那什么是json: json全称javascript object notation. 翻译过来叫js对象简谱.
如何把字典转化成我们的json格式的字符串呢?很简单, 上代码.
import json dic = {"a": "女王", "b": "萝莉", "c": "小清新"} s = json.dumps(dic) # 把字典转化成json字符串 print(s) # {"a": "u5973u738b", "b": "u841du8389", "c":"u5c0fu6e05u65b0"}
结果很不友好啊. 那如何处理中文呢? 在dumps的时候给出另一个参数ensure_ascii=False就可以了
import json dic = {"a": "女王", "b": "萝莉", "c": "小清新"} s = json.dumps(dic, ensure_ascii=False) # 把字典转化成json字符串 print(s) # {"a": "女王", "b": "萝莉", "c": "小清新"}
搞定了. 接下来. 前端给你传递信息了. 你要把前端传递过来的json字符串转化成字典.
import json s = '{"a": "女王", "b": "萝莉", "c": "小清新"}' dic = json.loads(s) print(type(dic), dic)
搞定. 是不是很简单. 以上两个代码要求. 记住, 理解, 背会
json也可以像pickle一样把序列化的结果写入到文件中.
dic = {"a": "女王", "b": "萝莉", "c": "小清新"} f = open("test.json", mode="w", encoding="utf-8") json.dump(dic, f, ensure_ascii=False) # 把对象打散成json写入到文件中 f.close()
同样也可以从也件中读取一个json
f = open("test.json", mode="r", encoding="utf-8") dic = json.load(f) f.close() print(dic)
注意. 我们可以向同一个文件中写入多个json串. 但是读不行
import json lst = [{"a": 1}, {"b": 2}, {"c": 3}] f = open("test.json", mode="w", encoding="utf-8") for el in lst: json.dump(el, f) f.close()
注意, 此时文件中的内容是一行内容.
{"a": 1}{"b": 2}{"c": 3}
这在读取的时候是无法正常读取的. 那如何解决呢? 两套方案. 方案一. 把所有的内容准备好统进行写入和读取. 但这样处理, 如果数据量小还好. 数据量大的话, 就不够友好了. 方案二. 不用dump. 改用dumps和loads. 对每一行分别进行处理.
import json lst = [{"a": 1}, {"b": 2}, {"c": 3}] # 写入 f = open("test.json", mode="w", encoding="utf-8") for el in lst: s = json.dumps(el, ensure_ascii=True) + " " f.write(s) f.close() # 读取 f = open("test.json", mode="r", encoding="utf-8") for line in f: dic = json.loads(line.strip()) print(dic) f.close()
四、configparser
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section)每个节可以有多个参数(键=值). 首先, 我们先看一个xxx服务器的配置文件
[DEFAULT] ServerAliveInterval = 45 Compression = yes CompressionLevel = 9 ForwardX11 = yes [bitbucket.org] User = hg [topsecret.server.com] Port = 50022 ForwardX11 = no
我们用configparser就可以对这样的文件进行处理.首先, 是初始化
import configparser config = configparser.ConfigParser() config['DEFAULT'] = { "sleep": 1000, "session-time-out": 30, "user-alive": 999999 } config['TEST-DB'] = { "db_ip": "192.168.17.189", "port": "3306", "u_name": "root", "u_pwd": "123456" } config['168-DB'] = { "db_ip": "152.163.18.168", "port": "3306", "u_name": "root", "u_pwd": "123456" } config['173-DB'] = { "db_ip": "152.163.18.173", "port": "3306", "u_name": "root", "u_pwd": "123456" } f = open("db.ini", mode="w") config.write(f) # 写入文件 f.flush() f.close()
读取文件信息:
config = configparser.ConfigParser() config.read("db.ini") # 读取文件 print(config.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信息 print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 从xxx章节中读取到xxx信息 # 也可以像字典一样操作 print(config["TEST-DB"]['DB_IP']) print(config["173-DB"]["db_ip"]) for k in config['168-DB']: print(k) for k, v in config["168-DB"].items(): print(k, v) print(config.options('168-DB')) # 同for循环,找到'168-DB'下所有键 print(config.items('168-DB')) #找到'168-DB'下所有键值对 print(config.get('168-DB','db_ip')) # 152.163.18.168 get方法Section下的key对应的value
增删改操作:
# 先读取. 然后修改. 最后写回文件 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"))