python基础知识---操作文件

一、打开文件  open()函数

open函数返回一个文件对象。

用法:open('文件名','模式')

打开文件的模式有:

  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,写读
  • a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

二、操作文件  读和写

read(5): 读取5个字节的数据(包括空格与换行),如果没有参数,则是读取尽量多的字节,甚至整个文件,放到一个字符串中

readline():没有参数,一次读取一行数据(包括换行符),放到一个字符串中

readlines():读取所有行(包括换行符),每行放到一个字符串,所有行组成一个字符串列表

write():将一个字符串写进文件

writelines():将一个字符串列表写进文件

三、关闭文件  close()

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('file1','r') as file_obj:
    file_obj.readlines()

四、几种读取文件方法的比较

#/usr/bin/env python
# -*- coding: utf-8 -*-
import fileinput
import sys
import re
#方法一:
#迭代一个或多个文件的所有行,不是将所有行读到列表,而是创建一个xreadlines对象
for x in fileinput.input(sys.argv[1:]):
        print x
        print "=========="

#方法二:
#读取一个文件的所有行到列表,然后再迭代列表,比较耗内存,大文件不建议这样做
with open("file","r") as file_obj:
        for i in file_obj.readlines():
                print i
                print "============="

#方法三:
#直接迭代文件对象,跟方法二一样,也是读取一个文件的所有行到列表,然后再迭代列表
with open("file","r") as file_obj:
        for i in file_obj:
                print i
                print "=========="

#方法四:
#readline() 一次读取一行
with open("file","r") as file_obj:
        L= file_obj.readline()
        while L:
                print L
                L= file_obj.readline()
                print "=========="

 

五、修改配置文件示例

原配置文件

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

需求

1、查
    输入:www.oldboy.org
    获取当前backend下的所有记录

2、新建
    输入:
        arg = {
            'bakend': 'www.oldboy.org',
            'record':{
                'server': '100.1.7.9',
                'weight': 20,
                'maxconn': 30
            }
        }

3、删除
    输入:
        arg = {
            'bakend': 'www.oldboy.org',
            'record':{
                'server': '100.1.7.9',
                'weight': 20,
                'maxconn': 30
            }
        }

demo

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json
import os

##获取backend记录
def fetch(backend):
    backend_title = 'backend %s' % backend
    record_list = []      #用于存储所有记录
    with open('haproxy.cfg') as obj:        #obj是一个文件对象
        flag = False
        for line in obj:    #文件是一个可迭代对象
            line = line.strip()            #去掉行首和行尾的空格和换行符
            if line == backend_title:
                flag = True
                continue
            if flag and line.startswith('backend'):  #遇到下一个'backend'字段退出   startswith('backend')表示以backend开头
                flag = False
                break

            if flag and line:      #flag为真且line为真
                record_list.append(line)

    return record_list

##添加backend记录
def add(dict_info):
    backend = dict_info.get('backend')     #获取'backend'的值
    record_list = fetch(backend)     #获取当前的backend记录
    backend_title = "backend %s" % backend
    current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn'])
    if not record_list:    #如果bakend记录不存在
        record_list.append(backend_title)
        record_list.append(current_record)
        with open('haproxy.cfg') as read_file, open('ha.new', 'w') as write_file:  #with支持同时对多个文件的上下文进行管理
            flag = False
            for line in read_file:
                write_file.write(line)    #写入字符串
            for i in record_list:         #列表是可迭代对象
                if i.startswith('backend'):
                    write_file.write(i+'\n')
                else:
                    write_file.write("%s%s\n" % (8*" ", i))      #8*" " 表示8个空格
    else:
        record_list.insert(0, backend_title)      #在列表指定下标前插入元素
        if current_record not in record_list:      #成员资格,序列通用方法
            record_list.append(current_record)    #append()   列表追加

        with open('haproxy.cfg') as read_file, open('ha.new', 'w') as write_file:
        #open()如果没有模式参数,默认为r   ,能以w模式打开不存在的文件(新建)
            flag = False
            has_write = False
            for line in read_file:
                line_strip = line.strip()
                if line_strip == backend_title:
                    flag = True
                    continue
                if flag and line_strip.startswith('backend'):
                    flag = False
                if not flag:
                    write_file.write(line)
                else:
                    if not has_write:
                        for i in record_list:      #
                            if i.startswith('backend'):
                                write_file.write(i+'\n')
                            else:
                                write_file.write("%s%s\n" % (8*" ", i))
                    has_write = True
    os.rename('haproxy.cfg','ha.bak')
    os.rename('ha.new','haproxy.cfg')

##删除backend记录
def remove(dict_info):
    backend = dict_info.get('backend')
    record_list = fetch(backend)
    backend_title = "backend %s" % backend
    current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn'])
    if not record_list:         #如果record_list为空
        return
    else:
        if current_record not in record_list:    #如果输入的record不存在
            return
        else:
            del record_list[record_list.index(current_record)]   #index返回列表元素的下标   #del删除列表元素
            if len(record_list) > 0:    #如果backend记录为0,则把backend删除
                record_list.insert(0, backend_title)
        with open('haproxy.cfg') as read_file, open('ha.new', 'w') as write_file:
            flag = False
            has_write = False
            for line in read_file:
                line_strip = line.strip()
                if line_strip == backend_title:
                    flag = True
                    continue
                if flag and line_strip.startswith('backend'):
                    flag = False
                if not flag:
                    write_file.write(line)
                else:
                    if not has_write:
                        for i in record_list:
                            if i.startswith('backend'):
                                write_file.write(i+'\n')
                            else:
                                write_file.write("%s%s\n" % (8*" ", i))
                    has_write = True
    os.rename('haproxy.cfg','ha.bak')
    os.rename('ha.new','haproxy.cfg')

if __name__ == '__main__':      #只有当本文件被执行时,才满足__name__=='__main__'
    print('1,get;2,add;3,del')
    num=input('input number:')
    data=input('input content:')
    if num == '1':
        content=fetch(data)    #content是一个列表
        print(''.join(content))      #   join方法将序列拼接成字符串  分隔符默认为一个空格
    else:
        dict_data = json.loads(data)    #  此处json.loads将字典模样的字符串变成字典
        if num == '2':
            add(dict_data)
        elif num == '3':
            remove(dict_data)
        else:
            pass

  

上一篇:jquery中html、text、val回调函数


下一篇:[技术] 如何正确食用cnblogs的CSS定制