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 @ 2016-10-08 20:58  前程明亮  阅读(371)  评论(0)    收藏  举报