实验十二 文件处理
第1关:读取宋词文件,根据词人建立多个文件
读取wjcl/src/step1/宋词.txt文件, 注意:宋词文件的标题行的词牌和作者之间是全角空格(" ")可复制该空格
在wjcl/src/step3/cr文件夹下根据每位词人建立一个文本文件,将各位词人的所有作品写入对应的文件
根据提示,在右侧编辑器补充代码,读取wjcl/src/step1/宋词文件,在wjcl/src/step3/cr/文件夹下根据每位词人建立一个文本文件,将各位词人的所有作品写入该文件。
建立文件
文件的打开 <file对象名>=open(<文件名>,<打开模式>) 打开一个文件,并创建一个file类对象 打开模式为a,追加写模式,文件不存在则创建,存在则在原文件最后追加内容 注意:打开文件后,指针定位在文件的最后 打开模式为w,覆盖写模式,文件不存在则创建,存在则完全覆盖源文件。
写入文件
f1.write(s) 向文件指针f1写入一个字符串
import shutil
import os
if os.path.exists("wjcl/src/step3/cr"):shutil.rmtree("wjcl/src/step3/cr")
os.mkdir("wjcl/src/step3/cr")
f1=open("wjcl/src/step1/宋词.txt",'r')
#代码开始for i in f1:if " " in i:xm = i.strip()[i.rfind(" ")+1:]f2 = open("wjcl/src/step3/cr/"+xm+".txt", "a")if len(i.strip())>0:f2.write(i)#代码结束
f1.close()
f2.close()
第2关:读取宋词文件,并根据词人建立多个文件夹
读取wjcl/src/step1/宋词文本文件,在wjcl/src/step4/sccr文件夹下根据每位词人姓名建立文件夹
文件及文件夹的管理
Os模块 os模块为系统内置模块,提供了对系统环境、文件、目录等操作系统级的接口函数。 os.path.exists() 文件夹是否存在 mkdir() 创建目录 rmdir() 删除目录 listdir() 返回指定目录下的所有文件和目录名 remove() 删除文件
根据提示,在右侧编辑器补充代码,读取wjcl/src/step1/宋词文本文件,在wjcl/src/step4/sccr文件夹下根据每位词人建立文件夹 注意:标题行的词牌名和作者之间是全角空格 (" ")可在此复制
import os
import shutil
if os.path.exists("wjcl/src/step4/sccr"):shutil.rmtree("wjcl/src/step4/sccr")
os.mkdir("wjcl/src/step4/sccr")
f1=open("wjcl/src/step1/宋词.txt",'r')
#代码开始for i in f1:i = i.strip()if " " in i:xm = i[i.rfind(" ") + 1:]s = "wjcl/src/step4/sccr/"+ xmif not os.path.exists(s):os.mkdir(s)f1.close()
#代码结束
第3关 读取宋词文件,建立多个词人文件夹,为每首词在文件夹下建立文本文件
读取wjcl/src/step1/宋词文本文件,为每位作者在wjcl/src/step5/cr下建立文件夹,再在作者文件夹下为每首词建立一个文件 注意:标题行的词牌名和作者之间是全角空格 (" ")可在此复制
李清照文件夹下的文件
import os
import shutil
if os.path.exists("wjcl/src/step5/cr"):shutil.rmtree("wjcl/src/step5/cr")
os.mkdir("wjcl/src/step5/cr")
f1=open("wjcl/src/step1/宋词.txt",'r')
#代码开始for i in f1:if " " in i:a = i.find(" ")xm = i.strip()[a+1:]s = "wjcl/src/step5/cr/"+ xmif not os.path.exists(s):os.mkdir(s)pm = i.strip()[:a]f2 = open(s+"/"+pm+".txt","a+")f2.write(i) f1.close()
f2.close()
#代码结束
第4关:文件的统计
编写统计文件夹下不同文件类型的数量和大小的程序。
os模块
os模块为系统内置模块,提供了对系统环境、文件、目录等操作系统级的接口函数 listdir() 返回指定目录下的所有文件和目录名 path.isfile() 检验是否是一个文件 path.splitext() 文件名和扩展名分离 os.path.getsize() 获取文件大小
注意:上述函数需要将文件夹和文件的完整路径作为参数
import os
wjzd={}
wjsize={}
lj="wjcl/src/test"
#代码开始
l = os.listdir(lj)
for i in l:if ".gitkeep" in i:continueelse:a = os.path.splitext(i)b = os.path.getsize("wjcl/src/test/"+i)wjsize[a[1]] = wjsize.get(a[1],0)+bwjzd[a[1][1:]] = wjzd.get(a[1][1:],0)+1
#代码结束
lb=list(wjzd.items())
lb.sort()
lb2=list(wjsize.items())
lb2.sort()
for i in range(len(lb)):print("文件类型{}文件数{}文件大小{:.2f}KB".format(lb[i][0],lb[i][1],lb2[i][1]/1024))
第5关:文件的移动
编写一个小程序,在test3文件夹下建立子文件夹,并根据文件类型将文件移动到相应的文件夹下。
os模块
os模块为系统内置模块,提供了对系统环境、文件、目录等操作系统级的接口函数。 listdir() 返回指定目录下的所有文件和目录名 mkdir() 创建目录 rmdir() 删除目录 path.isfile() 检验是否是一个文件 path.splitext() 文件名和扩展名分离 os.path.exists() 文件或文件夹是否存在
shulti模块
shutil模块是对os模块的补充,主要针对文件的拷贝、删除、移动、压缩和解压操作 rmtree(sdir) 删除文件夹(包括所有子文件夹和文件) move(src, ddir) 移动文件到另一个文件夹
根据test3文件夹下文件的类型,在test3文件夹下建立相应的子文件夹,并将文件移动到相应的文件夹下。 具体来说,扩展名为.jpeg.jpg.png.jifi的文件移动到图片子文件夹下,.mp3.wav移动到音频文件夹下,.mp4.flv移动到视频文件夹下,.txt.docx.pdf移动到文档文件夹下。 提示:可以建立字典来指定文件夹和文件的对应关系
最后,需要在test3下建立图片、文档、音频和视频四个文件夹,并将文件按扩展名的对应关系移动到相应文件夹下 最后显示如下
['ifs大熊猫.jpg', '基地1.jpg', '春熙路图集1.jfif', '春熙路图集2.jpeg', '春熙路图集3.jfif', '杜甫草堂.png', '青城山.png']
['pq.flv', '七彩丹霞视频.mp4', '云南十八怪_.mp4']
['学院设置.docx', '昆明.docx', '琵琶行并序.txt', '考题一.pdf', '考题四.pdf']
['add.wav', 'score.wav', '山歌好比春江水.mp3', '花儿尕恋手令.mp3']
import os
import shutil
wj={"图片":".jpeg.jpg.png.jfif","文档":".txt.docx.pdf","音乐":".mp3.wav","影像":".mp4.flv"}
lj1="wjcl/src/test2"
lj="wjcl/src/test3"
if os.path.exists(lj):shutil.rmtree(lj)
shutil.copytree(lj1,lj)
#代码开始
k=os.listdir(lj)
k.remove(".gitkeep")
for i in wj.keys():if not os.path.exists(lj+"/"+i):os.mkdir(lj+"/"+i)for i in k:wjm,kzm=os.path.splitext(i)if kzm in wj["图片"]:shutil.move(lj+"/"+i,lj+"/"+"图片")if kzm in wj["文档"]:shutil.move(lj+"/"+i,lj+"/"+"文档")if kzm in wj["音乐"]:shutil.move(lj+"/"+i,lj+"/"+"音乐")if kzm in wj["影像"]:shutil.move(lj+"/"+i,lj+"/"+"影像")#代码结束
ml=os.listdir(lj)
ml.sort()
for x in ml:if x!=".gitkeep":wj=os.listdir(lj+"/"+x)wj.sort()print(wj)