题目要求
- 编写一个程序:
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()