python文件操作之获取,增加 实例+详细分析
说明:
本博文主要讲python基础,关于文件操作方面的实例,本实例要求学习者掌握python基本文件操作,以及break,continue的时机,本实例着重练习 思维 。
本博文最后有本实例的详细分析!本博文为处女文,若有错误,可以提出,加以改进。
作业需求:
配置文件如下:

global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option dontlognull listen stats :8888 stats enable stats uri /admin stats auth admin:1234 frontend oldboy.org bind 0.0.0.0:80 option httplog option httpclose option forwardfor log global acl www hdr_reg(host) -i www.oldboy.org use_backend www.oldboy.org if www backend www.oldboy.org server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 backend buy.oldboy.org server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
源码与思路:

def add(backend, record): """ 添加对应 backend记录 :param backend: backend :param record: 要添加的记录 :return: """ record_list = gain(backend) #获得对应 backend记录,将记录存在列表 if not record_list: #若 列表为空,即backend 的记录不存在 with open('work', 'r+',encoding='utf-8') as old, open('work2', 'r+', encoding='utf-8') as new: for line in old: new.write(line) #先把旧的写到新的 new.write('\nbackend ' + backend + '\n') #再将新添加的记录写到后面 new.write(' ' * 8 + record) else: #backend的记录存在 if record in record_list: #若记录已经存在,则不增加,直接把旧的复制到新的 import shutil shutil.copy('work', 'work2') else: #记录不存在,则增加 record_list.append(record) #列表有对应backend所有记录 with open('work', 'r+', encoding='utf-8') as old, open('work2', 'r+', encoding='utf-8') as new: flag = False for line in old: if line.strip().startswith('backend') and line.strip() == 'backend ' + backend: flag = True new.write(line) for new_line in record_list: new.write(' ' * 8 + new_line +'\n') continue if flag and line.strip().startswith('backend'): flag = False if not flag and line.strip(): new.write(line)

def gain(backend): """ 获得对应backend的记录 :param backend: backend :return: 返回列表 """ result = [] #创建空列表 with open('work', 'r+', encoding='utf-8') as f: flag = False #标志置为False for line in f: if line.strip().startswith('backend') and line.strip() == 'backend ' + backend: flag = True #读到对应backend时,将标志置为True,再往下读有两种可能,一种读记录,一种是再次遇到backend continue if flag and line.strip().startswith('backend'): #再次遇到别的backend flag = False #将标志置为False,则不往下读 break if flag and line.strip(): #标志为True,则读记录 result.append(line.strip()) #将记录添加到内存列表 return result #返回列表
bk = 'www.oldboy.org' rd = 'server 100.1.2.2 100.1.2.2 weight 20 maxconn 30' add(bk,rd) ret = gain( 'www.oldboy.org' ) print (ret) #打印对应backend的记录 |
点评;本实例核心是gain() 和add() 方法,main()方法是用来调用这两个方法的。
先说gain()方法,方法目的是为了获取对应backend下的记录。
方法首先要想参数与返回值,参数可以想到是backend,通过传的backend值,来找对应的记录,返回值是查找到的记录,装到列表中。
接着再想,如何找到记录,这很简单,通过找开文件,再一行行查找 for line in f: 直到找到对应的backend,即:
if line.strip().startswith('backend') and line.strip() == 'backend ' + backend: 那接下来就更简单了嘛,直接将backend下面一行行
的记录添加到创建的空列表就可以了,但是,但是,当记录添加完毕后要如何停止呢??
于是标志位flag出现了!一开始就将flag置为False,当遇到想获取记录的backend时,则将标置位置为True,再往下一行行读,若再次遇到backend,
则 将flag再将置为False, 这样一来,当标志位为True时,每一行即是我们想读的记录了!!
再来说add()方法,方法目的是添加对应backend下的记录,对比gain()方法,自然要比其多一个record参数啦~
接下来就要分情况了,先说最简单的,
情况一:当对应的backend 在配置文件中,根本没有的时候,这时通过调用gain()方法返回的列表也必然为空,这时则需原配置文件
一行行写到备份文件,在备份文件最后添加上,想要添加的backend与记录
情况二:当对应的backend 在配置文件存在时,这时又分两种情况
情况2.1:想要添加的记录已存在(这种情况比较简单),直接把原配置文件复制到备份文件中即可!
情况2.2:想要添加的记录已存在(这种情况比较麻烦点),我们可以通过gain()方法返回的列表以及设置标志位来解决问题。
这里我简单写下,先将flag置为False,当找到想添加记录的backend时,将flag置为True, 接着(这很关键)
将想添加的记录加到gain()返回的列表中, 再将列表的元素对应地写到备份文件中。
出处:http://www.cnblogs.com/0zcl
文章未标明转载则为原创博客。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
1.非系统的学习也是在浪费时间
2.做一个会欣赏美,懂艺术,会艺术的技术人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?