shutil
高级文件功能,可以拷贝文件以及属性(用户、权限、属组等),递归的拷贝、删除、移动等,且可以压缩文件。
import shutil
shutil.copyfile(原文件,要拷贝到哪)
shutil.copyfile(r'C:\Users\Administrator\PycharmProjects\S19\day12\day12.py',
r'C:\Users\Administrator\PycharmProjects\S19\day16')
shutil.copymode()# 只拷贝权限
shutil.copymode(r'C:\Users\Administrator\PycharmProjects\S19\day12\day12.py',
'makes')
然后os.stat()查看文件状态,对比权限
# 递归拷贝文件
os.makedirs('a\b\c\d\e') # 递归创建文件夹
shutil.copytree('a\b\c\d\e',
r'C:\Users\Administrator\PycharmProjects\S19\day12\a\b\c\d\e')
# 树形结果拷贝
# 递归删除/ 有文件都删
shutil.rmtree(r'C:\Users\Administrator\PycharmProjects\S19\day12\a')
# 有文件都删,不报错,不提示,谨慎使用
# 递归移动,将a及a下面的文件夹都剪切到t文件夹下面,相当于ctrl+x
shutil.move(r'C:\Administrator\PycharmProjects\S19\day12\a',
r'C:\Administrator\PycharmProjects\S19\t')
# 文件打包
import shutil
import logging
logging.basicConfig(
level=logging.INFO,
format=('%(asctime)s - %(name)s - [%(lineno)d] - %(message)s'),
)
shutil.make_archive('test_uat','zip',logger=logging.error('test_uat.zip打包成功'))
# 2019-01-18 22:03:47,990 - root - [31] - test_uat.zip打包成功
# 这个包会打两层,第一层包含压缩包本身
import zipfile
z = zipfile.ZipFile('test_uat.zip','r') # 注意“r”模式
z.extractall(path=r'C:\Administrator\PycharmProjects\S19\day16\test')
# 解包 解了第一层,真正的包还在里边
collections
collections模块提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
namedtuple
from collections import namedtuple
t = namedtuple('time_tupel',['年','月','日','时','分','秒','毫'])
t1 = t(18,1,12,13,14,56,897)
print(t1) # time_tupel(年=18, 月=1, 日=12, 时=13, 分=14, 秒=56, 毫=897)
print(t1.年) # 18 (不能用字符串取)
命名元祖可以快速定位特定元祖的对应值
deque
双端队列,使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
队列 FIFO 先进先出 列表 链表
栈 LIFO 后进先出
import queue
q = queue.Queue() # 队列 容器
q.put('元素1')
q.put('元素2')
q.put('元素3')
# print(q) # 队列不能查看
print(q.get()) # 元素1
print(q.get()) # 元素2
print(q.get()) # 元素3
print(q.get()) # 阻塞,不报错,也不出值,在等待有新的元素进来
# 和生成器很像,不是生成器
列表:有序的,插入的元素会导致后边的元素全部后移,删除也会导致所有元素前移,当数据量较大时效率较低。
队列:列表+链表,元素固定指向上一个元素,当前边的元素删除后,指向就断了,后边的元素不受影响。
栈:栈顶指针,始终指向最上面一个,
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
deque双向队列,
from collections import deque
d = deque()
d.append('元素1') # 后入
d.append('元素2') # 后入
d.append('元素3') # 后入
d.appendleft('元素4') # 前入,列表前段加入
d.appendleft('元素5') # 前入
d.appendleft('元素6') # 前入,最后加的在最前面
d.append('元素7') # 后入,后边加入,最后加的在最后
d.remove('元素3')
print(d) # deque(['元素6', '元素5', '元素4', '元素1', '元素2', '元素7'])
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict,但是python3.6版本以上默认有序,在此不细讲。注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
defaultdict
# 如之前我们做过的例题:
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典
的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}
li = [11,22,33,44,55,77,88,99,90]
dic = {}
for i in li:
if i > 66:
dic.setdefault('k1',[]).append(i)
else:
dic.setdefault('k2',[]).append(i)
print(dic)
# 现在的方法可以这样……
from collections import defaultdict
li = [11,22,33,44,55,66,77,88,99,90]
my_dict = defaultdict(list) # 创建默认值为空列表的字典
for row in li:
if row > 66:
my_dict['k1'].append(row)
else:
my_dict['k2'].append(row)
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1存在
'abc'
dd['key2'] # key2不存在,返回默认值
'N/A'
Counter
Counter类是用来跟踪值出现的次数。
它是一个无序的容器类型,以字典的键值对形式返回,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。
Counter类和其他语言的bags或multisets很相似。
c = Counter('abcdeabcdabcaba')
print c
输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
s = ['a','b','c']
dic = {}
for i in s:
dic[i] = dic.get(i,0) + 1 # 字典取键,取不到返回0创键,取到加1计数
print(dic) # {'a': 1, 'b': 1, 'c': 1}