python基础学习笔记——shelve、shutil模块
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基础学习笔记——shelve、shutil模块的更多相关文章
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
		0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ... 
- python基础——14(shelve/shutil/random/logging模块/标准流)
		一.标准流 1.1.标准输入流 res = sys.stdin.read(3) 可以设置读取的字节数 print(res) res = sys.stdin.readline() print(res) ... 
- Python基础学习笔记(十一)函数、模块与包
		参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-functions.html 3. http://www.liao ... 
- Python 基础学习笔记(超详细版)
		1.变量 python中变量很简单,不需要指定数据类型,直接使用等号定义就好.python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前 ... 
- python 基础学习笔记(1)
		声明: 本人是在校学生,自学python,也是刚刚开始学习,写博客纯属为了让自己整理知识点和关键内容,当然也希望可以通过我都博客来提醒一些零基础学习python的人们.若有什么不对,请大家及时指出, ... 
- Python基础学习笔记(十)日期Calendar和时间Timer
		参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-date-time.html 3. http://www.liao ... 
- Python基础学习笔记(一)入门
		参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-chinese-encoding.html 3. http://w ... 
- python自动化测试学习笔记-5常用模块
		上一次学习了os模块,sys模块,json模块,random模块,string模块,time模块,hashlib模块,今天继续学习以下的常用模块: 1.datetime模块 2.pymysql模块(3 ... 
- 第一课、python基础学习笔记
		自动化非自动化的区别 自动化测试就是让机器按照人的想法把功能全部跑一遍 自动化测试的过程,让我们写一段程序去测试另一段程序是否正常的过程 Java 编译型语言, 编码-->编译-->解 ... 
随机推荐
- SNMP4J 总结
			一.SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMP ... 
- 107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II
			给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 ... 
- JDK原子类操作
			JDK原子类操作及原理 在JDK5之后,JDK提供了对变量的原子类操作, java.util.concurrent.atomic里都是原子类 原子类的分类 原子更新基本类型 原子更新数组 原子更新抽象 ... 
- Java开发中存在这样的代码,反而影响整体整洁和可读性
			不完美的库类 不完美的库类(Incomplete Library Class) 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建立 ... 
- substring和substr,slice和splice
			substring 和 substr 这二货都是针对字符串而言的,且都是返回一个副本,而不是在原字符串上直接操作. 上代码: var str = '0123456789'; console.log( ... 
- # iOS Block的本质(三)
			iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ... 
- winform中显示标题,点击打开链接
			效果:显示的是标题,但是点击打开的是链接 思路:定义一个类,将类实例化,向类中写入数据,再将类放到listbox中,设置listbox的显示分类为文本 前台:放入一个listbox控件 后台: pub ... 
- 迅为10.1寸人机界面工业HMI安卓电容屏定制生产供应商
			10.1寸人机界面介绍: 配置铁电存储器:非易失性记忆体,掉电后数据不丢失. 连接云端,支持云服务:数据综合管理,更有效率. 静电防护技术:高强度抗干扰,防静电,防电磁干扰. 提供所有接口的调用源码, ... 
- poj3264 划分树
			题意: 给定一个序列,询问区间中最大数减去最小数的结果 和2104差不多, 代码贴过来就OK了 #include <iostream> #include <algorithm> ... 
- core 下使用 autofac
			依赖注入小伙伴们比较常了,这里只说core 下autofac依赖注入的使用 ,不多费话,直接代码. 在 Startup.cs里 public void ConfigureServices(IServi ... 
