共计 2758 个字符,预计需要花费 7 分钟才能阅读完成。
引言
这篇文章介绍如何应用 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/env python | |
#coding=utf-8 | |
import os | |
import shutil | |
import time | |
#------ | |
def make_version_path(path,version): | |
"""返回版本文件门路""" | |
if version==0: | |
return path | |
else: | |
return path+"."+str(version) | |
#------ | |
def rotate(path,version=0): | |
"""实现文件轮换""" | |
if version>4: | |
return | |
old_path=make_version_path(path,version) | |
if not os.path.exists(old_path): | |
raise OSError("'%s' doesn't exist."%old_path) | |
new_path=make_version_path(path,version+1) | |
if os.path.exists(new_path): | |
rotate(path, version+1) | |
shutil.copy(old_path,new_path) | |
#------ | |
def rotate_log_file(path): | |
"""创立新日志文件""" | |
if os.path.exists(path): | |
with open(path,"a") as file1: | |
file1.write("\n"+time.ctime(time.time())) | |
else: | |
with open(path,"w") as file1: | |
file1.write(time.ctime(time.time())) | |
rotate(path) | |
rotate_log_file("/home/qing/test/qingsword/qingsword.log") | |
#运行程序后,"/home/qing/test/qingsword/" 下会创立一个 "qingsword.log" 文件,重复运行这个程序,会发现目录中的文件数量最多为 6 个,最大的文件编号为 "qingsword.log.5",这是因为在 rotate() 办法中做了最大版本号限度,如果 version 高于 4,那么就完结调用本身,这段程最初能够实现文件版本从,4>5,3>4,2>3,1>2,0>1 的版本复制操作。 |
0×4. 内存文件读写
有时咱们不须要将数据写入硬盘,只须要在内存中创立一个临时文件流,临时保留一些数据,这个时候就能够用到 StringIO 和 BytesIO,前者用来读写字符串数据,后者用来读写二进制数据,请看上面的实例:
#!/usr/bin/env python3 | |
#coding=utf-8 | |
#导入内存读写模块 | |
from io import StringIO,BytesIO | |
#初始化一个空内存字符串读写对象 | |
with StringIO() as si: | |
#同文件读写一样,写入数据 | |
si.write("""My website:www.qingsword.com""") | |
#查看以后文件流指针地位,写入后指针在文件流的开端 | |
print(si.tell()) #29 | |
#将指针指向第一个字符 | |
si.seek(0) | |
#读取全部内容(如果没有应用 seek(0),这一步将读取不到任何数据)print(si.read()) | |
#读取实现后,指针停留在文件流开端 | |
print(si.tell()) #29 | |
#将指针挪动到第三个字符的地位开始读取 | |
si.seek(2) | |
L=si.readlines() | |
for line in L: | |
print(line.strip()) | |
#如果不挪动数据流指针,想一次性读取所有数据流,能够应用 getvalue() 办法 | |
print(si.getvalue()) | |
#程序输入 | |
29 | |
My website:www.qingsword.com | |
29 | |
website:www.qingsword.com | |
My website:www.qingsword.com | |
#初始化一个二进制内存数据流对象,将晴刃这两个字编码成 utf-8,写入这个数据流对象 | |
with BytesIO() as bf: | |
bf.write("晴刃".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/env python3 | |
#coding=utf-8 | |
from io import StringIO | |
#创立一个内存文件流,并传入两行字符串,同时关上一个可写的磁盘文件流 | |
with StringIO("晴刃 \nwww.qingsword.com") as mf,\ | |
open("qing","w") as f1: | |
mf.seek(0) #将内存文件流指针设置成 0 | |
#读取内存文件流中的所有数据,写入磁盘中以后脚本所在目录下的 qing 文件中 | |
f1.write(mf.read()) | |
#查看写入是否胜利 | |
with open("qing","r") as f1: | |
print(f1.read()) | |
#程序输入(输入换行了,因为内存流创立的时候,蕴含了一个换行符 \n)晴刃 | |
www.qingsword.com |
正文完