提要:自定义运行快捷键
之前就觉得用鼠标点击还是太麻烦了,今天顺便设置了一下,参考点击这里
练习1:文件操作的初体验与编码问题
write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符
f = open(r"a.txt","w",encoding="utf-8") #指定utf-8编码 f.write("今天是2020-11-16") f.close()
编码与解码相匹配,可以正常的查看信息
f = open(r"Blank.txt","a",encoding="utf-8") s = ["Clichong\n","Lawrence\n","Kacura\n"] ss = "啦啦啦,啦啦啦,我是卖报的小当家" f.writelines(s) f.write(ss) f.close()
使用with上下文管理器来管理
s = ["Clichong ","Lawrence ","Kacura "] with open(r"Blank.txt","w",encoding="utf-8") as myio: myio.writelines(s) #不会自动的换行
ps:解决控制台乱码问题,设置为统一格式的编码就可以了
练习2:文件的读取
- read([size])
从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。
读取到文件末尾,会返回空字符串。
- readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
- readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
s = ["Clichong ","Lawrence ","Kacura "] with open(r"Birthday.txt","r",encoding="utf-8") as myio: print(myio.read(4),end="\n\n") myio.seek(0) print(myio.readline(),end="\n\n") myio.seek(0) print(myio.readlines(),end="\n\n") myio.seek(0) print(myio.read())
练习3:为文本文件每一行的末尾增加行号
with open(r"Blank.txt","r",encoding="utf-8") as myio: line = myio.readlines() print(list(enumerate(line))) #其中enumerate函数可以为每一行在开头添加一个行号 myline = [str(information).rstrip()+" #"+str(number+1)+"\n" for number,information in enumerate(line)] print(myline) with open(r"Blank.txt","w",encoding="utf-8") as myio: myio.writelines(myline)
添加了行号
练习4:复制一个文件
初始版本:
with open(r"Birthday.txt","r",encoding="utf-8") as myfile: with open(r"CopyBirthday.txt","w",encoding="utf-8") as mycopyfile: while True: if myfile.readline(): #由于判断的时候已经读取了文件会造成文件指针的偏移,会丢包 mycopyfile.write(myfile.readline()) else: break
改进版本:
with open(r"test.txt","r",encoding="utf-8") as myfile: with open(r"copytest.txt","w",encoding="utf-8") as mycopyfile: while True: line = myfile.readline() #指读取一次,不会丢包 if line: mycopyfile.write(line) else: break
可以看见,两个文件的内容完全相同
练习5:序列化与反序列化
我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
import pickle a1 = "Clichong" a2 = "Lawrence" a3 = "Kacura" with open(r"Blank.txt","wb+") as myfile: #只能是二进制的,而且不能指定编码形式 pickle.dump(a1,myfile) pickle.dump(a2,myfile) pickle.dump(a3,myfile) myfile.seek(0) print(myfile.read()) with open(r"Blank.txt","rb") as myfile: b1 = pickle.load(myfile) b2 = pickle.load(myfile) b3 = pickle.load(myfile) print(b1,b2,b3)
练习6:CSV 文件的操作
csv (Comma Separated Values) 是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。
import csv info = ['id','name','age','salary'] infos = [['1005','Petty','41','32000'],['1006','Kitty','22','10000']] with open(r"csvfile.csv","w",encoding="utf-8") as myfile: writebuf = csv.writer(myfile) writebuf.writerow(info) #写入一行(标题) writebuf.writerows(infos) #写入多行(数据) with open(r"csvfile.csv","r",encoding="utf-8") as myfile: readbuf = csv.reader(myfile) #创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素 # headers = next(readbuf) #获得列表对象,包含标题行的信息 print(list(readbuf)) myfile.seek(0) linetxt = [id+"-"+name+"-"+age+"-"+salary+"\n" for id,name,age,salary in readbuf] with open(r"Blank.txt", "w", encoding="utf-8") as mywritefile: mywritefile.writelines(linetxt)
成功的读取并改写数据:
练习7:目录操作
import os import os.path print("#当前工作路径是",os.getcwd()) #os.mkdir("testdir") #只能创建一次,若已创建则报错 #os.makedirs("音乐/刘德华") #一次可以创建多个目录 print("#是否是绝对路径",os.path.isabs("myfile06.py")) print("#是否是目录文件",os.path.isdir("myfile06.py")) print("#是否是文件",os.path.isfile("myfile06.py")) print("#文件是否存在",os.path.exists("myfile06.py")) print("#文件的大小是",os.path.getsize("myfile06.py")) print("#返回文件的最后访问时间",os.path.getatime("myfile06.py")) #返回文件的最后访问时间 print("#返回文件的最后创建时间",os.path.getctime("myfile06.py")) #返回文件的最后修改时间 print("#返回文件的最后修改时间",os.path.getmtime("myfile06.py")) print("#直接返回路径",os.path.abspath("myfile06.py")) #直接返回路径 print("#返回目录路劲",os.path.dirname("E:\PyCharm\workspace\myIO\myfile06.py")) #返回目录路劲 print("#对路径进行切割",os.path.split(os.path.abspath("myfile06.py"))) print("#对路径切割出文件的拓展名",os.path.splitext(os.path.abspath("myfile06.py"))) s = "D:\\" print("#对多个目录名进行连接形成绝对路径",os.path.join(s,"音乐","刘德华","忘情水.mp4"))
练习8:列出指定目录下所有的.py 文件,并输出文件名
方法一:自定义函数
import os import os.path os.chdir("E:\PyCharm\workspace") #更改当前的工作目录 print(os.getcwd()) def FileList(dirname): #传入一个目录名,就可以打印出目录下的全部.py文件 if not os.path.isdir(dirname): #判断是否为目录文件 print("Error! Not Dir!") return else: mylist = os.listdir(os.path.abspath(dirname)) #将所有的文件输出一个列表中方便处理 print(mylist) for file in mylist: filename,filetext = os.path.splitext(file) #python的特殊语法,真是太简单了 if filetext == ".py": print(file) FileList("myIO")
可以看见,正常的输出了全部的.py文件
方法二:使用endswith
此方法使用了字符串的一个endswith函数可以判断末尾的字符
for file in os.listdir(): if file.endswith("py"): #灵活的使用了字符串的函数 print(file)
方法三:推导式(一行代码搞掂)
灵活使用推导式可以使代码变得简洁
mypyfile = [pyfile for pyfile in os.listdir() if pyfile.endswith("py")]
如图所示,可以正常的输出
练习9:walk遍历函数的测试使用
os.walk()方法:返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
- dirpath:要列出指定目录的路径
- dirnames:目录下的所有文件夹
- filenames:目录下的所有文件
#测试walk函数 import os import os.path #os.chdir("E:\PyCharm\workspace") print(os.getcwd()) Allfile = os.walk(os.getcwd()) for dirpath,dirnames,filenames in Allfile: for dir in dirnames: print(os.path.join(dirpath,dir)) for file in filenames: print(os.path.join(dirpath,file)) # print(dirpath) # print(dirnames) # print(filenames)
练习10:测试shutil模块的拷贝与压缩
拷贝测试
#测试shutil模块 import shutil import os print(os.getcwd()) os.chdir("E:\PyCharm\workspace\myIO\音乐\刘德华") shutil.copy("note.txt","copynote.txt") os.chdir("E:\PyCharm\workspace\myIO") #不要忽视.这个符号,要写得完整为.txt,.html shutil.copytree("音乐\刘德华","电影",ignore=shutil.ignore_patterns(".txt",".html"))
运行前:
运行后:
压缩测试
- 第一种压缩方法
#把目录下:音乐/刘德华下的全部内容压缩到目录:电影/歌手 中去,格式为zip格式 shutil.make_archive("电影/歌手","zip","音乐/刘德华")
- 第二种压缩方法
import shutil import zipfile #shutil.make_archive("电影/歌手","zip","音乐/刘德华") myfile = zipfile.ZipFile("音乐/Clichong.zip","w") #压缩包存放位置 myfile.write("电影/copynote.txt") #往压缩文件夹中添加的数据 myfile.write("电影/note.txt") myfile.close()
解压缩测试
import shutil import zipfile #shutil.make_archive("电影/歌手","zip","音乐/刘德华") ''''''''' myfile = zipfile.ZipFile("音乐/Clichong.zip","w") myfile.write("电影/copynote.txt") myfile.write("电影/note.txt") myfile.close() ''''''''' myfile2 = zipfile.ZipFile("音乐/Clichong.zip","r") #要解压缩的文件为Clichong.zip myfile2.extractall("音乐") #解压缩的目录 myfile2.close()
练习11:使用递归的方法遍历整个目录并以树状打印出来
#递归遍历目录 import os def DirNameSearch(dirpassname,level): allname = os.listdir(dirpassname) for dirname in allname: wholefilename = os.path.join(dirpassname, dirname) if os.path.isdir(wholefilename): DirNameSearch(wholefilename,level+1) else: print("|_"+"___"*level,wholefilename) DirNameSearch("音乐",0)
目录结构如下:
遍历结果:
我们以整个目录测试一下:
DirNameSearch("E:\PyCharm\workspace\myIO",0)
还是可以比较好的遍历出来的