当前位置: 首页 > Linux

[Python]-10-文件读写(下)

时间:2023-04-07 00:20:29 Linux

介绍本文介绍如何使用python的os和shutil模块对文件或文件夹进行读写、创建、删除等操作。文章目录0×3。示例:日志文件循环0×4。内存文件读写0×3。示例:日志文件轮换有时我们可能需要连续写入一些日志。我们每次写的时候,一个为新版本,新版本总是没有文件号,然后老版本复制一个尾号,例如:qingsword.log,qingsword.log.1,qingsword.log.2,没有数字的是最新版本,2是最旧的版本。再次写入时,版本2会复制到版本3,版本1会复制到版本2,最新的存档会复制到1。不过每次都手动这样太麻烦了。如果文件量巨大,费时费力,那么如何让程序自动完成这些数字的轮换,请看下面的例子:#!/usr/bin/envpython#coding=utf-8importosimportshutilimporttime#------defmake_version_path(path,version):"""返回版本文件路径"""ifversion==0:returnpathelse:returnpath+"."+str(version)#------defrotate(path,version=0):"""Filerotationdone"""ifversion>4:returnold_path=make_version_path(path,version)如果不是os.path.exists(old_path):引发OSError("'%s'不存在。"%old_path)new_path=make_version_path(path,version+1)ifos.path.exists(new_path):rotate(path,version+1)shutil.copy(old_path,new_path)#------defrotate_log_file(path):"""Createanewlogfile"""ifos.path.exists(path):withopen(path,"a")asfile1:file1.write("\n"+time.ctime(time.time()))else:withopen(path,"w")asfile1:file1.write(time.ctime(time.time()))旋转(path)rotate_log_file("/home/qing/test/qingsword/qingsword.log")#运行程序后,会在"/home/qing/test/qingsword/"下创建一个"qingsword.log"文件,并且反复运行这个程序,你会发现目录下的文件数最多为6个,最大的文件数是“qingsword.log.5”。这是因为最大版本号在rotate()方法中受到限制。如果版本高于4,那么就完成调用自己,这个过程最终可以完成文件版本从,4>5,3>4,2>3,1>2,0>1的复制操作0×4。内存文件读写有时候我们并不需要向硬盘写入数据,只需要在内存中创建一个临时文件流来临时保存一些数据即可。这时候我们可以使用StringIO和BytesIO,前者用来读写字符String数据,后者用来读写二进制数据,请看下面的例子:#!/usr/bin/envpython3#coding=utf-8#导入内存读写模块fromioimportStringIO,BytesIO#初始化一个空内存字符串读写对象withStringIO()assi:#同文件读写,写入数据si.write("""我的网站:www.qingsword.com""")#查看当前文件流指针位置,写入后,指针在文件流末尾print(si.tell())#29#指向the指向第一个字符的指针si.seek(0)#读取所有内容(如果没有使用seek(0),这一步会读取到Can'tgetanydata)print(si.read())#读取后是完成后,指针停留在文件流的末尾print(si.tell())#29#将指针移动到第三个字符的位置,开始读取si.seek(2)L=si.readlines()forlineinL:print(line.strip())#如果不移动数据流指针,想一次读取所有数据流,可以使用getvalue()方法print(si.getvalue())#程序输出29我的网址:www.qingsword.com29网址:www.qingsword.com我的网址:www.qingsword.com#初始化一个二进制内存数据流对象,将清人这两个字编码成utf-8,用BytesIO写入这个数据流对象()作为bf:bf.write("SunnyBlade".encode("utf-8"))print(bf.getvalue())bf.seek(0)print(bf.read(3))print(bf.tell())#程序输出b'\xe6\x99\xb4\xe5\x88\x83'b'\xe6\x99\xb4'3必要,我们可以将内存中的文件流写入磁盘中的指定文件,例如:#!/usr/bin/envpython3#coding=utf-8fromioimportStringIO#创建一个内存文件流,传入两行string,同时打开一个可写磁盘文件流withStringIO("Qingblade\nwww.qingsword.com")asmf,\open("qing","w")asf1:mf.seek(0)#Set内存文件流指针指向0#读取内存文件流中的所有数据,写入到磁盘当前脚本所在目录的qing文件中f1.write(mf.read())#检查是否writingissuccessfulwithopen("qing","r")asf1:print(f1.read())#程序输出(输出是换行符,因为创建内存流时,包含换行符\n)青刃www.qingsword.com