python摸爬滚打之day022----模块(序列化操作)
1、pickle
可以将我们python中的任意数据类型转化成bytes并写入到文件中. 同样也可以把文件中写好的bytes转换回我们python的数据.
pickle可以直接序列化对象.
class Fruit:
def __init__(self,name,color):
self.name = name
self.color = color def eat(self):
return "haochi" p1 = Fruit("apple1","red1")
p2 = Fruit("apple2","red4")
p3 = Fruit("apple3","red2")
p4 = Fruit("apple4","red6")
lst = [p1,p2,p3,p4] pickle.dump(lst,open("fruit_info","wb")) lst = pickle.load(open("fruit_info","rb"))
for i in lst:
print(i.name)
pickle序列化对象
2、shelve
shelve提供python的持久化操作. 什么叫持久化操作呢? 说白话,就是把数据写到硬盘上. 在操作shelve的时候非常的像操作一个字典. 这个东西到后期. 就像redis差不多.
# shelve 数据的持久化操作, 像操作字典一样去操作shelve -----------------------------------------------------------------
d = shelve.open("shelve_file")
d["wlh"] = "王力宏"
d["ljj"] = {"name":"林俊杰","id":"singer"}
d["zj"] = {"name":"张杰","wife":{"name":"谢娜","gender":"女","worke":"大本营"}}
d.close() d = shelve.open("shelve_file")
d.pop("zj") # 能删除,但是再查询时会报错.
d.close() d = shelve.open("shelve_file",writeback=True) # 如果是嵌套字典的话, 必须得加上writeback回写参数, 不然没法修改
d["ljj"]["id"] = "歌手"
print(d["ljj"]["id"])
d.close()
shelve
3、configparser
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section), 每个节可以有多个参数(键=值)
import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = { # DEFAULT 是默认配置, 下面的一些子配置都会带上DEFAULT 里面的配置.
"默认设置1":"...1",
"默认设置2":"....2",
"默认设置3":".....3",
}
config["配置11"] = {
"设置11":"",
"设置12":"",
"设置13":"",
}
config["配置22"] = {
"设置21":"",
"设置22":"",
"设置23":"",
}
config["配置33"] = {
"设置31":"",
"设置32":"",
"设置33":"",
} with open("peizhi.ini","w",encoding="utf8") as f:
config.write(f) # 这里的write()方法是configparser自己重新写的,不是调用的文件操作的write() # 查
config = configparser.ConfigParser()
config.read("peizhi.ini",encoding="utf8")
print(config.sections()) # ['配置11', '配置22', '配置33']
print(config["配置33"]["设置33"]) # # 添加一个章节 先读取文件, 再修改, 最后写入文件
config = configparser.ConfigParser()
config.read("peizhi.ini",encoding="utf8")
config.add_section("配置44")
config["配置44"] = {
"设置41": "",
"设置42": "",
"设置43": "",
}
config.write(open("peizhi.ini","w",encoding="utf8")) # 修改章节
config = configparser.ConfigParser()
config.read("peizhi.ini",encoding="utf8")
config.set("配置44","设置43","")
config.write(open("peizhi.ini","w",encoding="utf8")) # 删除章节或 章节元素
config = configparser.ConfigParser()
config.read("peizhi.ini",encoding="utf8")
config.remove_section("配置44") # 删除"配置44"章节
config.remove_option("配置44","设置43") # 删除"配置44"里的"设置43"元素
config.write(open("peizhi.ini","w",encoding="utf8")) # 对config的所有修改操作都是先创建config对象,然后用config读取内容, 修改完之后再将config写进文件.
configparser
4、json
json是所有语言都通用的模块
4.1 json和pickle的比较?
dic = {1:"青铜",2:"白银",3:"黄金",4:"铂金",5:"钻石"} ret = json.dumps(dic,ensure_ascii=False) # 用 ensure_ascii=False 来处理非中文显示
print(ret,type(ret)) # json结果是 str 类型
# ret = pickle.dumps(dic)
# print(ret,type(ret)) # pickle结果是 bytes 类型
4.2 json写进文件
dic = {'王力宏':{"ji":"新加坡","gender":"男","album":"盖世英雄"},
"林俊杰":"爱笑的眼睛",
"张靓颖":{"gender":"女","album":"如果这就是爱情"},
"张杰":"云中的angle"
}
with open("singer_info.json","w",encoding="utf8") as f:
json.dump(dic,f,ensure_ascii=False,indent=4) # indent=4 即在json文件中改成好看点的格式
# 即下面格式:
# {
# "王力宏": {
# "ji": "新加坡",
# "gender": "男",
# "album": "盖世英雄"
# },
# "林俊杰": "爱笑的眼睛",
# "张靓颖": {
# "gender": "女",
# "album": "如果这就是爱情"
# },
# "张杰": "云中的angle"
# }
json数据写进文件
4.3 json也能处理对象, 也能将对象写进文件(通过间接方式将对象转成字典的形式,然后序列化字典写进文件)
class Fruit:
def __init__(self,name,color):
self.name = name
self.color = color def trans1(obj):
return {
"name": obj.name,
"color": obj.color,
}
# 用json序列化对象 ???
ap = Fruit("苹果","红色") # 方法一: __dict__ 对obj的各种封装信息(也是字典)进行序列化
# ret = json.dumps(ap.__dict__, ensure_ascii=False)
# print(ret) # 方法二: 对函数返回的结果进行序列化
ret = json.dumps(ap,default=trans1,ensure_ascii=False) # 把obj对象作为参数传进trans里,将返回的字典结果进行序列化
print(ret)
json序列化对象
class Fruit:
def __init__(self,name,color):
self.name = name
self.color = color def trans2(dic):
print(type(dic))
return Fruit(dic["name"],dic["color"]) # 返回自己构造的Fruit对象 # 用json反序列化
s = '{"name": "苹果", "color": "红色"}'
ap = json.loads(s,object_hook=trans2) # 先将s进行反序列化, 然后将反序列化结果作为参数传进trans2 ,在函数里自己构造对象
print(ap.color)
json反序列化对象
4.4 如何将大量数据写进文件?
不用 dump. 改用dumps和loads. 对每一行分别进行处理.
用dumps将数据逐个序列化, 并写进文件; 用loads逐行将字符串反序列化, 并输出(不能用load, 逐行读出来的字符串是不符合json语法规范, 没法load, 会直接报错).
# 用json写进大量数据
dic1 = {"name":"乱世佳人","show_time":1975,"score":8.5,"time":"180min"}
dic2 = {"name":"闻香识女人","show_time":1998,"score":8.8,"time":"160min"}
dic3 = {"name":"飞越疯人院","show_time":1973,"score":8.7,"time":"140min"}
dic4 = {"name":"霸王别姬","show_time":2001,"score":9.3,"time":"150min"}
lst = [dic1,dic2,dic3,dic4]
# with open("movie.json","w",encoding="utf8") as f:
# for i in lst:
# s = json.dumps(i,ensure_ascii=False)
# f.write(s+"\n") with open("movie.json","r",encoding="utf8") as f:
for line in f:
line = line.strip()
if not line:
continue
cont = json.loads(line) # 只是一个反序列化操作, 把字符串式的line转成字典形式.
# cont = json.load(line) # 错误写法, 这里line只是读取了json文件的一行,并没有全部读取,
# line里面所存的字符串是不符合json语法的,没法load, 所以读取出错.
print(cont)
json写入大量数据
python摸爬滚打之day022----模块(序列化操作)的更多相关文章
- Python json.dumps 特殊数据类型的自定义序列化操作
场景描述: Python标准库中的json模块,集成了将数据序列化处理的功能:在使用json.dumps()方法序列化数据时候,如果目标数据中存在datetime数据类型,执行操作时, 会抛出异常:T ...
- Python序列化操作与反序列操作
一.概念 序列化:转向一个字符串数据类型序列:字符串 二.需要做序列化操作的情况1.数据存储2.网络上数据传输 从数据类型到字符串的过程叫序列化从字符串到数据类型的过程叫反序列化 三.现有序列化模块1 ...
- python 常用模块(一): os模块,序列化模块(json模块 pickle模块 )
1.os模块 2.序列化模块:(1)json模块 和 pickle模块 一.os模块 os.path.abspath: (1)把路径中不符合规范的/改成操作系统默认的格式 import os path ...
- python常用模块: random模块, time模块, sys模块, os模块, 序列化模块
一. random模块 import random # 任意小数 print(random.random()) # 0到1的任意小数 print(random.uniform(-10, 10)) # ...
- python的I/O编程:文件打开、操作文件和目录、序列化操作
1 文件读写 1.1 打开文件: open(r'D:\text.txt') 1.2 文件模式 值 功能描述 'r' 读模式 'w' 写模式 'a' 追加模式 'b' 二进制模式 '+' 读写模式 1. ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- Python快速学习08:模块的操作
前言 系列文章:[传送门] 天气干燥,我就上火,流鼻血.希望身子好起来. 正文 函数和对象都是为了更好的组织已经有的程序,以方便重复利用. 模块(module)也是为了同样的目的.模块可以包含可执行代 ...
- python OS 模块 文件目录操作
Python OS 模块 文件目录操作 os模块中包含了一系列文件操作的函数,这里介绍的是一些在Linux平台上应用的文件操作函数.由于Linux是C写的,低层的libc库和系统调用的接口都是C AP ...
- python学习之模块导入,操作邮件,redis
python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...
随机推荐
- 使用viewport中的vm来适配移动端页面
前言 作为一个小前端,经常要和H5打交道,这就面临着不同终端的适配问题. Flexible方案通过Hack手段来根据设备的dpr值相应改变<meta>标签中viewport的值,给我更贴切 ...
- 查看PostgreSQL正在执行的SQL
SELECT procpid, START, now() - START AS lap, current_query FROM ( SELECT backendid, pg_stat_get_back ...
- 华为S12700 NQA配置
首先,nqa功能是需要授权的. 以下以ICMP配置方式示例: 在配置ICMP测试之前,需要NQA客户端与被测试设备间路由可达.(ICMP测试提供类似于普通ping命令的功能,但输出信息更为丰富.) 请 ...
- 【资料下载区】【iCore、 iCore2相关资料】更新日期2017/1/11
[新产品发布][iCore2 ARM / FPGA 双核心板] [iCore系列核心板视频教程]之 SDRAM 读写实验[iCore双核心组合是开发板例程][uCGUI 例程及代码包下载][iCore ...
- Java编程的逻辑 (91) - Lambda表达式
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- RTT(往返时间)和RPC
RTT(Round-Trip Time)往返时间在计算机网络中它是一个重要的性能指标.表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认,不包含数据传输时间)总共经 ...
- 理解面向过程(OPP)、面向对象(OOP)、面向切面(AOP)
概念 面向过程编程OPP:Procedure Oriented Programming,是一种以事物为中心的编程思想.主要关注“怎么做”,即完成任务的具体细节. 面向对象编程OOP:Object Or ...
- 使用glusterfs 作为 kubernetes PersistentVolume PersistentVolumeClaim 持久化仓库,高可用Rabbitmq,高可用mysql,高可用redis
glusterfs 怎么集群,网上一搜铺天盖地的 可利用这个特点做单节点高可用,因为K8S 哪怕节点宕机了 master 会在随意一台节点把挂掉的复活 当然我是在自己的环境下跑,经过网络的gluste ...
- 1.13flask完结
2019-1-13 14:16:26 终于完结flask,开始爬虫啦!!!! 还有 一些爬虫视频没看完,余下的就一点啦! 老师整理了flask的总结!和一些组件的使用! 打算重装一下电脑,边看视频,边 ...
- 类似于Mimikatz的Linux Hash Dump工具
项目主页 https://github.com/huntergregal/mimipenguin 需要root权限 支持 Kali 4.3.0 (rolling) x64 (gdm3) Ubuntu ...