Day17 计算文件夹的大小、os模块、shtil模块、zipfile、tarfile

1.计算文件夹的大小

请看上一篇博客。Day17.

2.os模块

# ### os 和 shutil 模块
'''
文件操作领域:
os     => 新建和删除
shutil => 复制和剪切
'''
import os
# 默认更改工作路径
os.chdir("/home/wangwen/mywork")
#os.mknod   创建文件
# os.mknod("ceshi1014.txt")

#os.remove  删除文件
# os.remove("ceshi1014.txt")

#os.mkdir   创建目录(文件夹)
# os.mkdir("ceshi1001")

#os.rmdir   删除目录(文件夹)
# os.rmdir('ceshi1001')

#os.rename  对文件,目录重命名
# os.rename("ceshi1001","ceshi1002")

#os.makedirs   递归创建文件夹
# os.makedirs("a/b/c/d")

#os.removedirs 递归删除文件夹(空文件夹)
# os.removedirs("./a/b/c/d")


# -- shutil模块 复制/移动/

# (1)仅仅复制文件内容的
#copyfileobj(fsrc, fdst[, length=16*1024])  复制文件 (length的单位是字符(表达一次读多少字符))
import shutil
fp1 = open("./3.txt","r",encoding="utf-8")
fp2 = open("./4.txt","w",encoding="utf-8")
shutil.copyfileobj(fp1,fp2)
#copyfile(src,dst)   #单纯的仅复制文件内容 , 底层调用了 copyfileobj
shutil.copyfile("3.txt","5.txt")  # copyfile 如果没有这个文件,自动创建

# (2)仅仅复制权限的
#copymode(src,dst)   #单纯的仅复制文件权限 , 不包括内容  (虚拟机共享目录都是默认777)
shutil.copymode("3.txt","6.txt")  # copymode 复制权限等操作的时,该文件必须存在
#copystat(src,dst)   #复制所有状态信息,包括权限,组,用户,修改时间等,不包括内容
shutil.copystat("3.txt","7.txt")

# (3)既复制文件内容 还 复制文件权限的 *****    
#copy(src,dst)       #复制文件权限和内容
shutil.copy("3.txt","8.txt")
#copy2(src,dst)      #复制文件权限和内容,还包括权限,组,用户,时间等
shutil.copy2("3.txt","9.txt")


# (4)递归拷贝或删除 
#copytree(src,dst)   #拷贝文件夹里所有内容(递归拷贝)
# shutil.copytree("/home/wangwen/mywork","/home/wangwen/mywork2")
#rmtree(path)        #删除当前文件夹及其中所有内容(递归删除)
# shutil.rmtree("/home/wangwen/mywork2")
#move(path1,paht2)   #移动文件或者文件夹
# shutil.move("./ceshi1002","../ceshi10003")

 

3.shtil模块

同上

4.zipfile

# ### 压缩模块 zipfile

# (1) 创建一个zip压缩包
import zipfile # zip_deflated  代表是压缩的意思
# 打开压缩包
zf = zipfile.ZipFile("ceshi1136.zip","w",zipfile.ZIP_DEFLATED)
print(zf)
# 写入文件
# write("路径","别名")
zf.write("/bin/cat","qqq")
zf.write("/bin/cp","chacl")
zf.write("/bin/chgrp","chgrp")
# 关闭压缩包
zf.close()


# (2) 解压文件
zf = zipfile.ZipFile("ceshi1136.zip","r")
# extractall("路径")  解压所有文件到一个文件夹当中
# zf.extractall("./ceshi1136")
# zf.extract("文件名","路径")  解压单个文件到一个文件夹当中
zf.extract("chgrp","./ceshi1136_2")
zf.close()

# (3) 追加文件
# zipfile 同样支持with语法
with zipfile.ZipFile("ceshi1136.zip","a",zipfile.ZIP_DEFLATED) as zf:
    # 在添加文件的时候,可以动态为该文件创建文件夹
    zf.write("/bin/cp","/abd/cp")
    
# (4) 查看压缩包中的内容
with zipfile.ZipFile("ceshi1136.zip","r") as zf:
    res = zf.namelist()
print(res)

 

5.tarfile

# ### tarfile 压缩模块
import tarfile
# (1)创建tarfile 压缩包
tf = tarfile.open("ceshi001.tar","w",encoding="utf-8")
# add(路径,别名) 添加文件到压缩包当中
tf.add("/bin/dash","dash")
tf.add("/bin/dd","dd")
tf.add("/bin/df","/tmp/df")
# 关闭压缩包
tf.close()  # 327680

# 按照gz算法 创建一个.tar.gz的压缩包
tf = tarfile.open("ceshi001.tar.gz","w:gz",encoding="utf-8")
tf.add("/bin/dash","dash")
tf.add("/bin/dd","dd")
tf.add("/bin/df","/tmp/df")
tf.close()  # 162558

# 按照bz2算法 创建一个.tar.bz2的压缩包
tf = tarfile.open("ceshi001.tar.bz2","w:bz2",encoding="utf-8")
tf.add("/bin/dash","dash")
tf.add("/bin/dd","dd")
tf.add("/bin/df","/tmp/df")
tf.close()  # 147524

# 理论上:bz2算法压缩包要比gz算法压缩的包小.

# (2) 解压文件
tf = tarfile.open("ceshi001.tar.gz","r",encoding="utf-8")
# 一次性解压所有
# tf.extractall("ceshi001")
# 解压单个文件
tf.extract("dd","ceshi001_dd")
tf.close()


# (3) 追加文件
'''
tarfile 有局限性,不能对已经压缩好的包进行追加文件
只能对光打包不压缩的文件进行追加
'''
# with tarfile.open("ceshi001.tar.bz2","a",encoding="utf-8") as tf:
with tarfile.open("ceshi001.tar","a",encoding="utf-8") as tf:
    # add(路径,别名)
    tf.add("/bin/sleep","sleep")


# (4) #查看压缩包中的内容
with tarfile.open("ceshi001.tar","r",encoding="utf-8") as tf:
    res = tf.getnames()
print(res)


# ###对tarfile 的追加进行改写
'''
(1) 把原来的压缩包进行解压
(2) 把要追加的文件塞进去
(3) 重新过滤,重新打包
'''
import os
#__file__
res = os.getcwd() 
path1 = os.path.join(res,"ceshi001.tar.bz2")
path2 = os.path.join(res,"ceshi0011")
print(path1) #/mnt/hgfs/gongxiang_16/day17/ceshi001.tar.gz
print(path2) #/mnt/hgfs/gongxiang_16/day17/ceshi0011

# (1) 把原来的压缩包进行解压
with tarfile.open(path1,mode="r",encoding="utf-8") as tf:
    tf.extractall(path2)
    
# (2) 把要追加的文件塞进去
# os.system("cp -a /bin/login /mnt/hgfs/gongxiang_16/day17/ceshi0011")
os.system("cp -a /bin/login    " + path2)

# (3) 开始过滤,dd这个文件过滤掉不要了
lst = os.listdir(path2)
# print(lst)
# for i in lst:
    # print(i)
with tarfile.open(path1,"w:bz2",encoding="utf-8") as tf:
    for i in lst:
        #/mnt/hgfs/gongxiang_16/day17/ceshi0011/dash
        pathnew = os.path.join(path2,i)        
        if i != "dd":
            # add(路径,文件/文件夹)
            tf.add(pathnew,i)
            
上一篇:python-day17


下一篇:【纪中受难记】——Day17:本来能AK