• python 之文件操作


    一.文件基本操作

      1.文件的打开 

    打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作  

       文件句柄 = open('文件路径', '模式')

    2.文件的读取

    >>> f = open("f:/test.txt", "r")
    >>> f.read()
    'hello,world'
    >>> f.close

      3.打开文件的模式有:  

    • r ,只读模式【默认】
    • w,只写模式【不可读;不存在则创建;存在则清空内容;】
    • x, 只写模式【不可读;不存在则创建,存在则报错】
    • a, 追加模式【可读;   不存在则创建;存在则只追加内容;】

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

    • r+, 读写【可读,可写】
    • w+,写读【可读,可写】
    • x+ ,写读【可读,可写】
    • a+, 写读【可读,可写】
    >>> f = open("f:/test.txt", 'r+')
    >>> f.read()
    'heheo,world~~'
    >>> f.write("
    aaaaaaa")
    8
    >>> f.tell()
    22
    >>> f.read()
    ''
    >>> f.tell()
    22
    >>> f.seek(0)
    0
    >>> f.read()
    'heheo,world~~
    aaaaaaa'

    "b"表示以字节的方式操作

    • rb  或 r+b
    • wb 或 w+b
    • xb 或 w+b
    • ab 或 a+b
    #以二进制文件写
    f = open("file.txt", "wb")
    str_data = "呵呵"
    bytes_data = bytes(str_data, encoding='utf-8')
    f.write(bytes_data)
    f.close()
    #以二进制文件读
    f = open("file.txt",'rb')
    data = f.read()
    f.close()
    print(data)
    str_data = str(data,encoding="utf-8")
    print(str_data)

        注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

      4. r+, w+, x+, a+ 区别

      r+ 可读,可写,若文件不存在会报错,根据指针位置可写随意位置

      w+ 可写,可读,若文件不存在会创建,在进行写操作会清空文件内容

      x+ 可写,可读,若文件存在会报错,不存在则创建

      a+ 可写,可读,只能追加在文件尾部

    5.文件内部支持操作:

    readline()   逐行读取数据

    #逐行去读,较省内存
    f = open('log','r') result = list() for line in open('log'): line = f.readline() print(line) result.append(line) print(result) f.close()

    trancate(),从文件的首行首字符开始截断,截断文件为n个字符;无n表示从当前位置起截断;截断之后n后面的所有字符被删除

     

    >>> with open("f:/test.txt" , 'r+') as f:
    ...     f.seek(2)
    ...     f.truncate(3)
    ...
    2
    3
    >>> with open("f:/test.txt" , 'r+') as f:
    ...     f.read()
    ...
    'hel'

    read(),读取文件内容

    >>> with open("f:/test.txt" , 'r+') as f:
    ...     f.read()
    ...
    'hel'

    write(),写入内容

    >>> with open("f:/test.txt" , 'r+') as f:
    ...     f.read()
    ...     f.write('llo' + '
    ' + 'test')
    ...     f.seek(0)
    ...     f.read()
    ...
    'hel'
    8
    0
    'helllo
    test'

    readlines(), 将文件内容以列表的形式存放,---->[“第一行”, "第二行"] 

    >>> with open("f:/test.txt" , 'r+') as f:
    ...     temp = f.readlines()
    ...     print(temp)
    ...
    ['heheo,world~~
    ', 'aaaaaaa']

    open(),打开文件

    >>> f = open('f:/test.txt', 'r')

    close(),关闭文件

     f.close()

    flush(),强行刷入硬盘  

    tell()  获取指针位置
    seek()  跳转到某个位置

    二.管理上下文

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

    with open("log", 'r+') as f:
        data = f.read()
        print(data)

    三.练习  

    编写脚本实现 ,用户登录,注册,改密,删除功能

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #删除用户,修改密码
    def login(username, password):
        """
        用户登录验证
        :param username: 用户名
        :param password: 密码
        :return: True成功,False失败
        """
        f = open('log', 'r', encoding='utf-8')
        for line in f:
            line = line.strip()
            userlist = line.split('$')
            if username == userlist[0] and password == userlist[1]:
                return True
        return False
    
    def user_ex(username):
        """
        用于检测用户是否存在
        :param username: 用户名
        :return: True 表示存在,False用户不存在
        """
        with open('log','r',encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                userlist = line.split('$')
                if username in userlist:
                    return True
        return False
    
    def res(username, password):
        """
        用于用户注册
        :param username: 用户名
        :param password: 密码
        :return: True注册成功
        """
        with open('log','a',encoding='utf-8') as f:
            temp = "
    " + username + "$" + password
            f.write(temp)
        return True
    
    def change_pwd(username, password):
        """
        用户修改密码
        :param username: 用户名
        :param password: 修改后的密码
        :return: True修改成功,False修改失败
        """
        file_object = open('log')
        try:
            lines=open('log','r').readlines()
            for i in range(len(lines)):
                if username in lines[i]:
                    test=lines[i].split('$')[1]
                    lines[i]=lines[i].replace(test,password)
                    open('log','w').writelines(lines)
                    return True
            return False
        finally:
            file_object.close( )
    
    def del_user(username):
        """
        删除用户
        :param username: 要删除用户名
        :return: true 删除成功,False用户名不在列表中
        """
        file_object = open('log')
        try:
            lines = open('log', 'r').readlines()
            for i in range(len(lines)):
                if username in lines[i]:
                    del lines[i]
                    print(lines)
                    open('log','w').writelines(lines)
                    return True
                else:
                    return False
        finally:
            file_object.close()
    
    # def del_user(username):
    #     with open('log', 'r') as f:
    #         for line in f:
    #             if re.match("lisi", line):
    #                 pass
    #             else:
    #                 data = line
    #     with open('log', 'w+') as f:
    #         f.write(data)
    #         return True
    #     return False
    
    
    
    
    def main():
        inp = input("1:登录;2:注册;3:删除用户;4:修改密码")
        user = input("请输入用户名:")
        pwd = input("请输入密码:")
        if inp == "1":
            ret = login(user, pwd)
            if ret:
                print("登录成功")
            else:
                print("登录失败")
        elif inp == "2":
            is_ex = user_ex(user)
            if is_ex:
                print("用户已存在,无法注册")
            else:
                resgister = res(user, pwd)
                if resgister:
                    print("用户已成功注册")
                else:
                    print("注册失败")
        elif inp == "3":
            del_us = del_user(user)
            if del_us:
                print("已删除")
            else:
                print("无此用户")
        elif inp == "4":
            is_chage = change_pwd(user, pwd)
            if is_chage:
                print("修改成功")
            else:
                print("无此用户")
    
    main()

     2.haproxy配置文件更改操作

    需求:

      1.匹配值 ,并将匹配到的内容以列表形式返回给用户

      2.插入内容,用户input数据后,将数据更新至配置文件中

    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
    配置文件
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
     
     
    def fetch(backend):
        result = []
        with open('ha.conf', 'r') as f:
            flag = False
            for line in f:
                if line.strip().startswith('backend') and line.strip() == "backend " + backend:
                    flag = True
                    continue
                if flag and line.strip().startswith('backend'):
                    break
                if flag and line.strip():
                    result.append(line.strip())
     
        return result
     
     
    def add(backend, record):
        result = fetch(backend)
        if not result:
            # 无backend,无record
            pass
        else:
            # 有backend
            if record in result:
                # 记录record
                pass
            else:
                result.append(record)
                with open('ha.conf', 'r') as old, open('new.conf', 'w') as new:
                    continue_flag = False
                    for line in old:
     
                        if line.strip().startswith('backend') and line.strip() == "backend " + backend:
                            continue_flag = True
                            new.write(line)
                            for temp in result:
                                new.write(" "*8 + temp + "
    ")
                            continue
     
                        if continue_flag and line.strip().startswith('backend'):
                            continue_flag = False
     
                        if continue_flag:
                            pass
                        else:
                            new.write(line)
     
     
    def add2(backend, record):
        with open('ha.conf', 'r') as old, open('new.conf', 'w') as new:
            in_backend = False
            has_backend = False
            has_record = False
            for line in old:
                if line.strip().startswith('backend') and line.strip() == "backend " + backend:
                    has_backend = True
                    in_backend = True
                    new.write(line)
                    continue
     
                if in_backend and line.strip().startswith('backend'):
                    if not has_record:
                        new.write(" "*8 + record + '
    ')
                    new.write(line)
                    in_backend = False
                    continue
     
                if in_backend and line.strip() == record:
                    has_record = True
                    new.write(line)
                    continue
     
                if line.strip():
                    new.write(line)
     
            if not has_backend:
                # 写backend,写record
                new.write('backend '+ backend + '
    ')
                new.write(' '*8 + record + '
    ')
     
     
    # ret = fetch("www.oldboy.org")
    # print(ret)
     
    # add('www.oldboy.org', "server 100.1.7.10 100.1.7.10 weight 20 maxconn 3000")
    # add2('www.oldboy.org', "server 100.1.7.11 100.1.7.11 weight 20 maxconn 3000")
    View Code

     3. 号码段截取

    需求:

      将文件中的第二列前三字节和后四字节以逗号分开,文件格式如下:

    1,"1300000","山东","济南","中国联通","0531","250000"
    2,"1300001","江苏","常州","中国联通","0519","213000"
    3,"1300002","安徽","巢湖","中国联通","0565","238000"
    4,"1300003","四川","宜宾","中国联通","0831","644000"
    5,"1300004","四川","自贡","中国联通","0813","643000"
    

      需求目标:

    1,"130","0000","山东","济南","中国联通","0531","250000"

    代码实现:
    def phone():
        with open("mobile", "w+") as nf, open("Mobile.txt", "r") as f:
            for row in f:
                row = row.strip().split(',')
                row = (row[:1] + [row[1][:4]+'"', '"' + row[1][4:]] + row[2:])
                nf.write(str(row).strip('[]').replace('" ', "")+'
    ')
    

      

  • 相关阅读:
    sql server 2008数据复制方法
    排错技能:任务管理器中追踪某w3wp.exe是哪个IIS站点的application pool
    SplendidCRM中给来自EditView中的listbox控件设置选中值或数据源
    jQuery String Functions
    [转]jquery getJSON 数据联动(采用序列化和反序列化获取数据) .
    [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
    深入理解C语言
    Qt回忆录之配置开发环境
    360电话面试
    浅谈C++设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/jl-bai/p/5485775.html
Copyright © 2020-2023  润新知