Python3 shutil、collections模块

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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值