一、eval模拟序列化操作

1、序列化

内存中的数据-------->转成一种中间格式(字符串)---------->存到文件中

dic={'name':'egon','age':18}
with open('db','w',encoding='utf-8')as f:
f.write(str(dic))

db文本内容:

{'name': 'egon', 'age': 18}

2、反序列化

文件-------->读取中间格式(字符串)--------->eval转成内存中的数据结构

with open('db','r',encoding='utf-8')as f:
data=f.read()
dic=eval(data)
print(dic,type(dic))

  执行结果:

{'name': 'egon', 'age': 18} <class 'dict'>

3、python中eval不适合做序列化

x='[null,true,false,1]'
eval(x)
1、eval会报错:功能是把两边的引号去掉把[null,true,false,1]拿出来
2、eval不能识别null,true,false,只能识别python的数据格式
#因此:不能用eval做序列化。

二、json模块

1、序列化json的使用及识别的python类型

import json
x='[null,true,false,1]'
res=json.loads(x)
print(res,type(res))

  执行结果:

[None, True, False, 1] <class 'list'>

注:json识别python的类型:

'''
JSON pyhton类型
{} dict
[] list
'string' str
1234.56 int或float
ture/false Ture/False
null None
'''

2、json使用方式一(json.dumps, json.loads)

2.1、序列化:内存中的数据结构--------->转成一种中间格式(字符串)----------->存到文件中

import json
dic={'name':'egon','age':18}
res=json.dumps(dic)#dumps把单引号准换成双引号
print(res,type(res))#json格式全都是双引号

  执行结果:

{"name": "egon", "age": 18} <class 'str'> #把内存中的字典转成了字符串

写到硬盘上:

with open('db.json','w',encoding='utf-8')as f:
f.write(res)

 执行结果:db.json内容

{"name": "egon", "age": 18}

2.2、反序列化:文件--------->读取中间格式(字符串)--------->转成内存中的数据结构

with open('db.json','r',encoding='utf-8')as f:
data=f.read()
dic=json.loads(data)
print(dic,type(dic),dic['name'])

  执行结果:

{'name': 'egon', 'age': 18} <class 'dict'> egon

3、json使用方式二(json.dump, json.load)

3.1、序列化:

import json
dic={'name':'egon','age':18} with open('db1.json','wt',encoding='utf-8')as f:
json.dump(dic,f)

  执行结果:db1.json内容

{"name": "egon", "age": 18}

3.2、反序列化

import json
with open('db1.json','rt',encoding='utf-8')as f:
dic=json.load(f)
print(dic)

  执行结果:

{'name': 'egon', 'age': 18}

三、pickle模块(序列化)

注:pickle只适用于python内部使用,不适合跨平台使用

1、pickle模块使用方法一(pickle.dumps,  pickle.loads)

1.1、序列化

import pickle
s={1,2,3,4,}#集合
res=pickle.dumps(s)
print(s,type(res))
with open('db.pkl','wb')as f:
f.write(res)

1.2反序列化

import pickle
with open('db.pkl','rb')as f:
data=f.read()
# print(data) #执行结果:b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
s=pickle.loads(data)
print(s,type(s)) #执行结果:{1, 2, 3, 4} <class 'set'>

2、pickle模块使用方法二(pickle.dump, pickle.load)

2.1、序列化

import pickle
s={1,2,3,4,}
with open('db.pkl','wb')as f:
pickle.dump(s,f)

2.2、反序列化

import pickle
with open('db.pkl','rb')as f:
s=pickle.load(f)
print(s,type(s))#执行结果:{1, 2, 3, 4} <class 'set'>

总结:pickle与json的区别:

  1、pickle都是以bytes类型读和写,不适用于跨平台所以用的较少,通常只在python内部使用

   2、json以str类型读和写,在很多方面都适用,跨平台性强,但是在python中也有弊端,只能识别部分类型。

四、os模块

import os
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量 os.path系列
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小 优先掌握
print(os.path.dirname(r'D:\mypython\projects\基础练习\a3.log'))#拿到文件夹名
print(os.path.basename(r'D:\mypython\projects\基础练习\a3.log'))#拿到文件名
print(os.path.exists(r"D:/mypython/projects/基础练习/01 序列化.py"))#判断路径是否存在,返回Ture,只判断路径是否存在不区分文件还是文件夹。
print(os.path.isfile(r"D:/mypython/projects/基础练习/01 序列化.py"))#判断文件是否存在,返回Ture
print(os.path.join('C:\\','a','b','a.txt')) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
print(os.path.join('C:\\','a','b','D:\\','a.txt')) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略,拼接成路径
print(os.path.getsize(r'D:\mypython\projects\基础练习\boss.log')) #单位是字节

2018-08-1316:28:27

json模块、os模块的更多相关文章

  1. 07 json与os模块(进阶)

    json和os模块 阶段一 .数据交换 1.json的基本介绍 JSON全名是JavaScript Object Notation(即:JavaScript对象标记)它是JavaScript的子集. ...

  2. Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块

    Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块 一丶序列化模块 什么是序列化: ​ 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输 ...

  3. json模块 os模块 文件加密

    目录 一:random随机模块 二:os模块 三:文件处理选择任意视频 四:sys模块 五:实现文件执行加密操作 六:json 序列化模块 七:json序列化 反序列化 八:json 文件写读方式 九 ...

  4. day 20 collection模块 time 模块 os 模块

    一.collection模块 1.namedtuple: 生成可以使用名字来访问元素内容的tuple 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 3.Counter: 计数器,主要 ...

  5. python常用模块: random模块, time模块, sys模块, os模块, 序列化模块

    一. random模块  import random # 任意小数 print(random.random()) # 0到1的任意小数 print(random.uniform(-10, 10)) # ...

  6. day13 函数模块之序列化 random 模块 os模块 sys模块 hashlib模块 collections模块

    json import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 ...

  7. 常用模块(collections模块,时间模块,random模块,os模块,sys模块,序列化模块,re模块,hashlib模块,configparser模块,logging模块)

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  8. random模块 os模块

    # random# import random# random.random() # 大于0且小于1之间的小数# random.randint() # 大于等于1且小于等于3之间的整数# random ...

  9. Python学习第十二课——json&pickle&XML模块&OS模块

    json模块 import json dic={'name':'hanhan'} i=8 s='hello' l=[11,22] data=json.dumps(dic) #json.dumps() ...

  10. python time模块 sys模块 collections模块 random模块 os模块 序列化 datetime模块

    一 collections模块 collections模块在内置的数据类型,比如:int.str.list.dict等基础之上额外提供了几种数据类型. 参考博客 http://www.pythoner ...

随机推荐

  1. 使用mysql5.7新特性解决前通配符查询性能问题

    众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...

  2. windows网络命令汇总

    分类: 网络技术2011-10-26 09:43 2557人阅读 评论(0) 收藏 举报 windows网络路由器dns服务器internetinterface Ping命令: ping命令通过发送I ...

  3. MySQL的基础(优化)2

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  4. BZOJ1951:[SDOI2010]古代猪文(Lucas,CRT)

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...

  5. PIL 图像字符画绘制

    from PIL import Image ascii_char = list('"$%_&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]? ...

  6. 「bzoj3956: Count」

    题目 刚开始并没有看懂题意于是痛苦的挣扎了好久 题意是这样的 问\([l,r]\)有多少对\((i,j)\)满足\(a_i\)和\(a_j\)恰好是\(a_i...a_j\)中严格最大的两个数 强制在 ...

  7. 【洛谷P2184】贪婪大陆

    贪婪大陆 题目链接 对于一个区间[l,r],右端点在l左边即[1,l-1]中的区间与区间[l,r]没有交集, 左端点在r右边即[r,n]中的区间与区间[l,r]没有交集, 其余区间必与[l,r]有交集 ...

  8. Android学习笔记_65_登录功能本身没有任何特别

    对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可.但是为了保持登录的状态(在各个Activity之间切换时要让网站知道用户一直是处于登录的状态)就需要进行cooki ...

  9. MapFile

    MapFile是排序后的SequenceFile, 这个排序是由开发者来保证的, 不是内存实现. 相当于对key作了一个分块索引,  只针对key. 缺点 1.文件不支持复写操作,不能向已存在的Seq ...

  10. 微信小程序分包加载

    分包加载 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载. 在构建小程序分包项目时,构建会输出一个或多个功能的分包,其中每个分包小程序必定含有一个主 ...