万恶之源 - Python模块二
shelve
我们之前学了json和pickle模块 这些都是序列化的模块,咱们进行在讲一个序列化的东西 叫做shelve
你们肯定有个疑问,这个东西和那个类似为什么要讲.是因为这个模块比较简单的,并且你们后期存储数据的时候需要使用数据库,但是当数据较少的时候我们就可以不用通过网络去和数据库进行交互了.直接使用咱们本地的文件就可以了
好了,我们现在来看看这个有多简单.
首先我们要import shelve这个模块,然后就像操作文件一样就可以啦.好我们来试试
import shelve
f = shelve.open('sss')
这样我们就创建了三个文件,一听三个文件是不是就迷了,别急我们往下看
sss.bak
'name', (0, 28)
这个bak没别的功能就是备份的文件
sss.dat
�]q (KKK}qX 1qKse.
sss.dir
'name', (0, 28)
纳尼,这些都是些什么啊,你有没在这样想?? 这是我们windows系统下创建文件获取的内容,不用去管它.但是记住一句不要手欠去加个内容
我们刚刚提到了windows下是这三个,那苹果是啥呢,苹果的就是sss.bb,好了这些都是无关紧要的.我们只需知道怎么去用就可以了.
我们只需要向使用字典的方式去操作就行了
import shelve
f = shelve.open('sss')
f['name'] = [1,2,3,{'1':2}]
print(f['name'])
以上的操作就是在增加一个键值对,这里的键有个需求是键必须是字符串类型.值就是python类型的数据没有要求
我们现在将一个字典就写到文件中,我们换个py文件值需要打开这个文件就可以使用这字典了.你们会想了.这个和json/pickle有什么区别是在这样的概念下是没有区别,就是将一个对象持久化的存到文件中.
咱们来想想如果我后期需要频繁的增加键值对,要是使用pickle和json来实现的是不是需要一次dump然后在增加
我们先来看看pickle的字典增加键值对
import pickle
# 首先我们需要打开一个文件
f = open('ss','wb')
dic = {'name':'宝元'}
# 将dic字典序列化到这ss文件中
pickle.dump(dic,f)
#然后在打开这个文件
f1 = open('ss','rb')
# 将这个文件中的内容反序列出来
dics = pickle.load(f1)
# 附一个新的变量
print(dics)
dics['age'] = 18
# 然后进行添加值
print(dics)
f2 = open('ss','wb')
# 在把最新的这个字典序列化文件中
dics = pickle.dump(dics,f2)
f3 = open('ss','rb')
dics = pickle.load(f3)
# 最后在反序列回来进行打印这个字典
print(dics)
这样写是没有问题,但是咱们来看看shelve是怎么实现的
import shelve
f = shelve.open('sss')
f['name'] = [1,2,3,{'1':2}]
print(f['name'])
# 添加后我们就能直接查看了,不在需要多次的dump和load了
f['age'] = 20
print(f['age'])
上下一对比,是不是觉得shelve还是挺简单的,这还不算完,其实shelve这个模块就是一个open和字典的操作就可以了
回想一下字典中都有哪些功能,它就有什么功能..
但是不得不说的就是它有它的问题,它的问题就是不能直接查看字典中所的内容,我们想要看这个字典中都有什么功能就
需要循环这个字典了
方式一
import shelve
f = shelve.open('sss')
for k in f:
print(k)
运行结果:name
方式二
import shelve
f = shelve.open('sss')
for k in f.keys():
print(k)
运行结果:name
和咱们的字典一模一样,我们要是查看f.keys()和咱们预想不一样,这个不能查看只能for循环
有的时候我们想要修改字典中name对应的值,这个时候我们应该怎么操作
import shelve
f = shelve.open('sss')
f['name'] = '宝元'
print(f['name'])
f['name'] = 'meet'
print(f['name'])
运行结果:
宝元
meet
我们现在距离成功只差一步了,差什么呢?? 这个东西在那会用到呢?
这个东西如果没有强烈的要求时,我们就可以使用这种方式来进行序列化,他其实就是基于pickle实现的.
咱们这个shelve模块有个坑你们需要注意的就是文件回写的时候会出现写不成功,你们只需要在open这函数的地方写一个writeback=True 这就是回写.
shutil
今天是一个福利日,刚刚告诉你们一个快速使用序列化的模块,在教你们一个模块shutil
这个模块就是针对文件和文件夹在做操作,并且还具有压缩包的功能.废话不多说我们现在把这模块导入进来
import shutil
我们就先看看文件有什么操作
import shutil
shutil.copyfileobj(open('aa.py','r',encoding='utf-8'),open('as.py','w',encoding='utf-8'))
拷贝文件,可以自己指定模式和编码方式
import shutil
shutil.copyfile(r'D:\untitled2\a\as.py', 'f2.log') #目标文件必须存在
拷贝文件,第一个参数放一个源文件,第二参数放一个要拷贝到那个文件的名字,模式不用管,编码方式默认是utf-8
仅拷贝权限。内容、组、用户均不变
shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
拷贝文件和权限
import shutil
shutil.copy2('f1.log', 'f2.log')
递归的去拷贝文件夹
1 import shutil
3 shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
#目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
递归的去删除文件
import shutil
shutil.rmtree('folder1')
递归的去移动文件
import shutil
shutil.move('folder1', 'folder3')
创建压缩包并返回文件路径,例如:zip、tar
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如 data_bak =>保存至当前路径
如:/tmp/data_bak =>保存至/tmp/
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象
#将 /data 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
#将 /data下的文件打包放置 /tmp/目录
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
zipfile压缩解压缩
import zipfile
# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()
# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall(path='.')
z.close()
tarfile压缩解压缩
import tarfile
# 压缩
t=tarfile.open('/tmp/egon.tar','w')
t.add('/test1/a.py',arcname='a.bak')
t.add('/test1/b.py',arcname='b.bak')
t.close()
# 解压
t=tarfile.open('/tmp/egon.tar','r')
t.extractall('/meet')
t.close()
万恶之源 - Python模块二的更多相关文章
- 万恶之源 - Python模块一
序列化 我们今天学习下序列化,什么是序列化呢? 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 为什么要有序列化模块: 比如,我们在python代码中计算的一个数据需要给另外一段程序使用 ...
- 万恶之源 - Python数据类型二
列表 列表的介绍 列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. 比如JS中的数 组, java中的数组等等. 它是以[ ]括起来, 每个元素用' , '隔开而且可以存放各 ...
- Python - 模块(二)
目录 Python - 模块(二) re re下面的方法 logging os Python - 模块(二) re re模块提供了正则表达式的相关操作 主要字符介绍: . 通配符,除了换行符之外的任意 ...
- 万恶之源-python基本数据类型
万恶之源-基本数据类型(dict) 本节主要内容: 字典的简单介绍 字典增删改查和其他操作 3. 字典的嵌套 ⼀一. 字典的简单介绍 字典(dict)是python中唯⼀一的⼀一个映射类型.他是以{ ...
- 万恶之源 - Python包的应用
包的简介 你们听到的包,可不是女同胞疯狂喜欢的那个包,我们来看看这个是啥包 官方解释: Packages are a way of structuring Python’s module namesp ...
- 万恶之源 - Python 自定义模块
自定义模块 我们今天来学习一下自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块啊 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组 ...
- 万恶之源 - Python基础
Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程 ...
- python 模块二(os,json,pickle)
#################################总结##################### os常用 os.makedirs('baby/安哥拉/特斯拉/黄晓明') os.mkd ...
- 万恶之源 - Python开发规范
开发规范 什么是开发规范?为什么要有开发规范呢? 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目,系统等,少 ...
随机推荐
- 【laravel5.6】The Process class relies on proc_open, which is not available on your PHP installation.
部署服务器的时候,使用composer来安装依赖.遇到了 解决办法: 在php.ini中,找到disable_functions选项,看看后面是否有proc_open函数被禁用了,如果有的话,去掉即可
- day_6.14py网络编程
被动套接字和新建出套接字的区别 单任务,单线程,非阻塞!!!!服务器! #2018-6-14 16:51:25 #!--*--coding:utf-8 --*-- ''' 单进程,单任务 少的可以,多 ...
- HashMap TreeMap ConcurrentHashMap
1 HashMap java se 1.6 1.1 父类 java.lang.Object 继承者 java.util.AbstractMap<K,V> 继承者 java.util.Has ...
- python3.6利用pyinstaller模块打包程序为.exe可执行程序
步骤: 1.安装pyinstaller模块:(必须在联网情况下进行) 操作原理: python3.6已经自带了pip,所以只需要在cmd中执行 pip install pyinstaller 就可以安 ...
- ubuntu下pig报错ERROR 2999: Unexpected internal error. Failed to create DataStorage的解决
2019-03-04 00:10:03,998 [main] ERROR org.apache.pig.Main - ERROR 2999: Unexpected internal error. Fa ...
- tar命令参数详解
命令总览:tar [-]A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | u ...
- CSS 小技巧
CSS 小技巧 一.边框内圆角 我们在设计例如按钮等控件的时候,会遇到这样的设计:只有内侧有圆角,而边框或者描边的四个角还是保持直角的形状,用以下代码可以轻松的实现. #wrapper { width ...
- Xcode编译警告Assigning to 'id<XXXDelegat> ——Nullable' from incompatible type 'XXXView *const_strong'
编译报警告 可能是 自定义分类使用协议时出现与父类协议的冲突 解决方法如下:
- [daily][nfs] nfs客户端设置
[daily] 主机间目录共享 1. 安装nfs工具,其实是mount需要mount.fs 否则会出现类似如下错误: [root@stds ~]# mount -t nfs 192.168.7.1:/ ...
- redis使用rdb恢复数据
redis中存在rdb备份和aof备份两种方式. 如果在redis多个节点发生雪崩时,我们往往使用定期冷备rdb或者aof文件,去恢复数据的方式,但往往数据量较大时rdb恢复更加的快速,毕竟aof保存 ...