Python shutil,zipfile练习

题目要求

  1. 编写一个程序:
    a. 这个程序会在源代码所在文件夹创建一个新的文件夹名称为outputForLab8
    b. 程序会在outputForLab8文件夹里面创建50个txt文件
    (1) 这50个txt文件的文件名由英文字母和数字构成,随机生成5位长度文件名
    (2) 这50个txt文件里面随机写入不同的内容,做到大小不一。比如有的文件3行内容,有的文件500行内容。
    c. 创建完成以后,程序会读取这50个文件的文件路径和大小,把这些数据逐行写入filesize.txt文件中保存起来,filesize.txt存在outputForLab8文件夹外面,也就是你源代码所在文件夹。
    d. 用zipfile库把outputForLab8文件夹里面的文件打包成一个zip压缩包,取名称为output8.zip
    e. 用正则表达式读取filesize.txt里面的文件大小信息,把里面所有文件的大小加起来和output8.zip的大小进行比较。看哪一个大,并输出两者大小的差距,计算打印zip的压缩率。

分段完成功能

a.创建一个新的文件夹名称为outputForLab8

def creatFolder():   #创建文件夹
    outputFilePath=os.path.join(".","outputRorLab8")
    os.makedirs(outputFilePath,exist_ok=True)

b.创建50个txt文件,文件名由英文字母和数字构成,随机生成5位长度文件名,里面随机写入不同的内容,做到大小不一。比如有的文件3行内容,有的文件500行内容

def creatFiftyfiles():    #创建文件并随机给名字以及内容

    outputFilePath=os.path.join(".","outputRorLab8")
    os.makedirs(outputFilePath,exist_ok=True) 

    srcFilePath=os.path.join(".","outputRorLab8") 
    # srcFileList=os.listdir(srcFilePath)
    num=[]      #创建随机文件姓名
    list=[chr(i) for i in range(65,91)]
    list1=[chr(i) for i in range(97,123)]
    for i in range(0,10):
        num.append(i)
    list=list+list1+num
    name=""
    for i in range(0,5):
        random_num=int(random.random()*(len(list)))
        name=name+str(list[random_num])
    name=name+".txt"
    #print(name)

    #随机创建文件内内容
    fileNum=int(random.random()*50000)
    fileContent=""
    for i in range(0,fileNum):
        random_num=int(random.random()*(len(list)))
        fileContent=fileContent+str(list[random_num])
        if(fileNum%5==0):
            fileContent=fileContent+'\n'
    srcFilePath=os.path.join(".","outputRorLab8")  
    srcFileList=os.listdir(srcFilePath)  
    outputTestFileName=os.path.join(srcFilePath,name)

    try:
        outputTestFile=open(outputTestFileName,"a")
        outputTestFile.write(fileContent)
    except Exception as e:
        print(e)
    finally:
        outputTestFile.close()

c.程序会读取这50个文件的文件路径和大小,把这些数据逐行写入filesize.txt文件中保存起来,filesize.txt存在outputForLab8文件夹外面,也就是你源代码所在文件夹。

    srcFilePath=os.path.join(".","outputRorLab8")  #返回当前文件夹
    srcFileList=os.listdir(srcFilePath)  
    # print(srcFilePath)

    srcSumFilePath=os.path.join(".") 
    try:
        outputTestSumFileName=os.path.join(srcSumFilePath,"filesize.txt")
        outputTestFile=open(outputTestSumFileName,"a")

        for fileName in srcFileList:  
            fileSize=os.path.getsize(os.path.join(srcFilePath,fileName)) 
            checkFilePath=os.path.realpath(fileName)
            #fileSize=fileSize/1024 是否改为KB为单位
            fileInformation=str(checkFilePath)+"  "+str(fileSize)+"B"+'\n'
           
            outputTestFile.write(fileInformation)

    except Exception as e:
        print(e)
    finally:
        outputTestFile.close()

d.用zipfile库把outputForLab8文件夹里面的文件打包成一个zip压缩包,取名称为output8.zip


def baleFile():
    zipDestPath=os.path.join(".","output8.zip")
    zipSourcePath=os.path.join(".","outputRorLab8")

    srcFileList=os.listdir(zipSourcePath)  
    for i in range(0,50):
        filename=srcFileList[i]
        zipSourcePath=os.path.join("outputRorLab8",filename)
        with zipfile.ZipFile(zipDestPath,"a") as newZip:
            newZip.write(zipSourcePath,filename)

e. 用正则表达式读取filesize.txt里面的文件大小信息,把里面所有文件的大小加起来和output8.zip的大小进行比较。看哪一个大,并输出两者大小的差距,计算打印zip的压缩率。

def compare():
    srcFilePath=os.path.join(".")  #返回当前文件夹
    srcFileList=os.listdir(srcFilePath)  
    #print(srcFileList)

    pattern=r"(\d{2,6})B*"
    regexHandle=re.compile(pattern)
    sum=0

    try:
        hwFile=open(os.path.join(srcFilePath,"filesize.txt"),"r",encoding="utf-8")
        while True:
            line=hwFile.readline()
            # print(line)
            
            if(not (line)):
                break
            
            result=regexHandle.findall(line)  
            # print(result)
            # print("长度"+str(len(result)))
            # print("值"+str(result))
            sum=sum+int(result[len(result)-1])
        sum=sum
        print("所有分开的文件所占空间的的和:{}".format(sum))
    #  print(hwFile.readline())
    except Exception as e:
        print(e)
    finally:
        hwFile.close()

    rootFolderPath=os.path.join(".")
    listOfFiles=[]
    for currentFolder,subFolders,fileNames in os.walk(rootFolderPath):
        for fileName in fileNames:
            filePath=os.path.join(currentFolder,fileName)
            fileSize=os.path.getsize(filePath)
            fileObject={fileName:fileSize}
            if(fileName=="output8.zip"):
                listOfFiles.append(fileObject)

    print("压缩包所占空间为",end="")
    print(int(listOfFiles[0]["output8.zip"]))
    baleSum=int(listOfFiles[0]["output8.zip"])
    if(sum>baleSum):
        print("分开文件总和占空间比较大,差距为:",(sum-baleSum/1024),"KB")

    else:
        print("压缩包总和占空间比较大,差距为:",(baleSum-sum)/1024,"KB")
    print("压缩率为:",sum/baleSum)

代码展示

import os,sys,shutil,re,zipfile
import random
#运行多次存在出错的可能,将创建的三个文件删除即可
def creatFolder():   #创建文件夹
    outputFilePath=os.path.join(".","outputRorLab8")
    os.makedirs(outputFilePath,exist_ok=True)


def creatFiftyfiles():    #创建文件并随机给名字以及内容

    outputFilePath=os.path.join(".","outputRorLab8")
    os.makedirs(outputFilePath,exist_ok=True) 

    srcFilePath=os.path.join(".","outputRorLab8") 
    # srcFileList=os.listdir(srcFilePath)
    num=[]      #创建随机文件姓名
    list=[chr(i) for i in range(65,91)]
    list1=[chr(i) for i in range(97,123)]
    for i in range(0,10):
        num.append(i)
    list=list+list1+num
    name=""
    for i in range(0,5):
        random_num=int(random.random()*(len(list)))
        name=name+str(list[random_num])
    name=name+".txt"
    #print(name)

    #随机创建文件内内容
    fileNum=int(random.random()*50000)
    fileContent=""
    for i in range(0,fileNum):
        random_num=int(random.random()*(len(list)))
        fileContent=fileContent+str(list[random_num])
        if(fileNum%5==0):
            fileContent=fileContent+'\n'
    srcFilePath=os.path.join(".","outputRorLab8")  
    srcFileList=os.listdir(srcFilePath)  
    outputTestFileName=os.path.join(srcFilePath,name)

    try:
        outputTestFile=open(outputTestFileName,"a")
        outputTestFile.write(fileContent)
    except Exception as e:
        print(e)
    finally:
        outputTestFile.close()

def checkFile():
    
    srcFilePath=os.path.join(".","outputRorLab8")  #返回当前文件夹
    srcFileList=os.listdir(srcFilePath)  
    # print(srcFilePath)

    srcSumFilePath=os.path.join(".")  #返回当前文件夹
    try:
        outputTestSumFileName=os.path.join(srcSumFilePath,"filesize.txt")
        outputTestFile=open(outputTestSumFileName,"a")

        for fileName in srcFileList:  #获得文件夹内的文件内容
            fileSize=os.path.getsize(os.path.join(srcFilePath,fileName))  
            #totalFileSize=totalFileSize+fileSize
            checkFilePath=os.path.realpath(fileName)
            #fileSize=fileSize/1024 是否改为KB为单位
            fileInformation=str(checkFilePath)+"  "+str(fileSize)+"B"+'\n'
            #print(fileInformation)
            outputTestFile.write(fileInformation)

    except Exception as e:
        print(e)
    finally:
        outputTestFile.close()

def baleFile():
    zipDestPath=os.path.join(".","output8.zip")
    zipSourcePath=os.path.join(".","outputRorLab8")

    srcFileList=os.listdir(zipSourcePath)  
    for i in range(0,50):
        filename=srcFileList[i]
        zipSourcePath=os.path.join("outputRorLab8",filename)
        with zipfile.ZipFile(zipDestPath,"a") as newZip:
            newZip.write(zipSourcePath,filename)
def compare():
    srcFilePath=os.path.join(".")  #返回当前文件夹
    srcFileList=os.listdir(srcFilePath)  
    #print(srcFileList)

    pattern=r"(\d{2,6})B*"
    regexHandle=re.compile(pattern)
    sum=0

    try:
        hwFile=open(os.path.join(srcFilePath,"filesize.txt"),"r",encoding="utf-8")
        while True:
            line=hwFile.readline()
            # print(line)
            
            if(not (line)):
                break
            
            result=regexHandle.findall(line)  
            # print(result)
            # print("长度"+str(len(result)))
            # print("值"+str(result))
            sum=sum+int(result[len(result)-1])
        sum=sum
        print("所有分开的文件所占空间的的和:{}".format(sum))
    #  print(hwFile.readline())
    except Exception as e:
        print(e)
    finally:
        hwFile.close()

    rootFolderPath=os.path.join(".")
    listOfFiles=[]
    for currentFolder,subFolders,fileNames in os.walk(rootFolderPath):
        for fileName in fileNames:
            filePath=os.path.join(currentFolder,fileName)
            fileSize=os.path.getsize(filePath)
            fileObject={fileName:fileSize}
            if(fileName=="output8.zip"):
                listOfFiles.append(fileObject)

    print("压缩包所占空间为",end="")
    print(int(listOfFiles[0]["output8.zip"]))
    baleSum=int(listOfFiles[0]["output8.zip"])
    if(sum>baleSum):
        print("分开文件总和占空间比较大,差距为:",(sum-baleSum/1024),"KB")

    else:
        print("压缩包总和占空间比较大,差距为:",(baleSum-sum)/1024,"KB")
    print("压缩率为:",sum/baleSum)
def main():
    creatFolder() 
    zipSourcePath=os.path.join(".","outputRorLab8")
    srcFileList=os.listdir(zipSourcePath)  
    # print(len(srcFileList))

    if(len(srcFileList)<49):
        for i in range(0,50):
            creatFiftyfiles()
        checkFile()
        baleFile()
    compare()



if __name__ == '__main__':
    main()
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值