test: 博客美化中……

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
View Code
复制代码

 


 

 

 

源码与思路:

复制代码
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)
View Code
复制代码

 

复制代码
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          #返回列表
View Code
复制代码


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()返回的列表中, 再将列表的元素对应地写到备份文件中

 

posted @   前程明亮  阅读(363)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示