zoukankan      html  css  js  c++  java
  • Python开发——6.文件操作

    一、文件操作

    1.文件操作的处理流程

      打开文件得到文件句柄并赋值给一个变量====》通过句柄对文件进行分析====》关闭文件

    #1. 打开文件,得到文件句柄并赋值给一个变量
    f=open('Lakers.txt','r',encoding='utf-8') #默认打开模式就为r
    
    #2. 通过句柄对文件进行操作
    data=f.read()
    
    #3. 关闭文件
    f.close()

      为了避免忘记关闭文件,可以用with open

    #
    with open("Lakers.txt", "r", encoding="utf-8") as f:
        data = f.read()
    print(data)
    #
    with open("Lakers.txt","r",encoding="utf-8") as f1, 
        open("Spurs.txt","w",encoding="utf-8") as f2:
        data1 = f1.read()
        f2.write("tim
    21
    未来是你的")
    print(data1)

      文件打开时指定的编码要和保存时指定的编码相同,否则会出现乱码。

    2.打开文件的模式

    (1)打开文件的模式

      打开文件的模式(默认为文本模式):只读(r),只写(w),只追加(a)

    (2)非文本模式

      对于非文本模式,只能用b模式,“b”表示以字节的方式操作,rb,wb,ab。b模式不需要考虑文本文件的字符编码、图片、视频的格式等,读取的内容是字节类型,写入时也要指定字节类型,不能指定编码。

    a.文件模式

      r 读模式,默认的模式

    f = open("Lakers.txt","r",encoding="utf-8")
    data = f.read()
    print(data)

      w 写模式,写之前会创建新的文件,如果文件存在,内容会被覆盖

    f = open("Lakers.txt","w",encoding="utf-8")
    f.write("kobe byrant
    24&8
    湖人总冠军")
    f.close()

      a 写模式,在文件最后追加内容

    f = open("Lakers.txt","a",encoding="utf-8")
    f.write("老子库兹马,又帅又能打")
    f.close()

    b.binary mod,二进制模式

      b的方式读

    f = open("Lakers.txt","rb")
    data = f.read()
    print(data)
    print(data.decode("utf-8"))
    f.close()

      b的方式写

    f = open("Spurs.txt","wb")
    f.write(bytes("马刺马刺马刺
    Tim Duncon
    未来是你的",encoding="utf-8"))
    f.close()

    c.t text mod,文本模式

    d.+ open a disk file for updating (reading and writing)

    e.U universal newline mode (for backwards compatibility; should not be used in new code)

    f = open("Spurs.txt","r",encoding="utf-8",newline="")
    data = f.readlines()
    print(data

    3.文件的操作

    (1)f.read()  

      读取文件的全部内容,光标移动到文件的末尾 

    (2)f.readline()

      读取文件的一行内容,光标移动到文件下一行开头

    with open("Lakers.txt","r",encoding="utf-8") as f:
        data1 = f.readline()
        data2 = f.readline()
        data3 = f.readline()
        data4 = f.readline()
        # data5 = f.readline()
    print(data1,data2,data3,data4)

    (3)f.readlines()  

      读取每一行内容,存放于列表中

    with open("Lakers.txt","r",encoding="utf-8") as f:
        data1 = f.readlines()
    print(data1)

    (4)f.write()

    (5)f.writelines()

    with open("Spurs.txt","a",encoding="utf-8") as f:
        f.writelines(["
    kawaii
    ","张铁林
    ","张继科
    "])

    (6)

      f.readable()  判断文件是否可读

      f.writable()  判断文件是否可写??

      f.closed()  判断文件是否关闭

      f.flush()  将文件从内存刷新到硬盘

    4.光标移动

      f.read(n) 文本模式下移动n个字符,b模式下移动n个字节

      f.seek(n) 任何模式下都是移动n个字节

      offset -- 开始的偏移量,也就是代表需要移动偏移的字节数

      whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。1和2必须在b模式下

    f = open("Lakers.txt","rb")
    f.seek(3,0)
    print(f.tell())
    f.seek(3,1)
    print(f.tell())
    f.seek(-3,2)
    print(f.tell())

      f.truncate(n) 截取n个字节

      f.tell() 显示光标当前位置

    二、一个文件操作系统

    # 实现功能:1.函数操作 2.文件处理 3.tag的用法 4.文件的解耦
    import os
    def file_handler(backend_data,res=None,type="fetch"):#文件的解耦
        if type == "fetch":
            with open("haproxy.conf","r") as read_f:
                tag = False#tag用法
                ret= []
                for read_line in read_f:
                    if read_line.strip()==backend_data:
                        tag =True
                        continue
                    if tag and read_line.startswith("backend"):
                        break
                    if tag:
                        print(read_line,end="")
                        ret.append(read_line)
            return ret
        elif type == "change":
            with open("haproxy.conf", "r") as read_f, open("haproxy.conf_new", "w") as write_f:
                tag = False
                has_write = False
                for read_line in read_f:
                    if read_line.strip() == backend_data:
                        tag = True
                        continue
                    if tag and read_line.startswith("backend"):
                        tag = False
                    if not tag:
                        write_f.write(read_line)
                    else:
                        if not has_write:
                            for record in res:
                                write_f.write(record)
                            has_write = True
            os.rename("haproxy.conf", "haproxy.conf.bak")
            os.rename("haproxy.conf_new", "haproxy.conf")
            os.remove("haproxy.conf.bak")
    def fetch(data):
        print("这是查询功能")
        print("用户数据是",data)
        backend_dat= "backend %s" %data
        return (file_handler(backend_dat))
    
    def add():
        pass
    
    def change(data):
        backend=data[0]["backend"]
        backend_data="backend %s" %backend
        old_server_record="%sserver %s %s weight %s maxconn %s
    " %(" "*8,data[0]["record"]["server"],
                                                                  data[0]["record"]["server"],
                                                                  data[0]["record"]["weight"],
                                                                  data[0]["record"]["maxconn"])
        new_server_record="%sserver %s %s weight %s maxconn %s
    " %(" "*8,data[1]["record"]["server"],
                                                                  data[1]["record"]["server"],
                                                                  data[1]["record"]["weight"],
                                                                  data[1]["record"]["maxconn"])
        print("用户想要修改的记录是:",old_server_record)
        res = fetch(backend)
        print("来自change函数读取的内容:",res)
        if not res or old_server_record not in res:
            print("没有找到要修改的内容")
        else:
            index = res.index(old_server_record)
            res[index]=new_server_record
        res.insert(0,"%s
    " %backend_data)
        file_handler(backend_data,res=res,type="change")
        return res
    
    def delete():
        pass
    
    if __name__ == "__main__":#判断功能
        msg='''
        1:查询
        2:增加
        3:修改
        4:删除
        5:退出
        '''
        msg_dic={
            "1":fetch,
            "2":add,
            "3":change,
            "4":delete,
        }
        while True:
            print(msg)
            choice = input("请输入你的选项: ").strip()
            if not choice:continue
            if choice == "5": break
    
            data = input("请输入你的数据:").strip()
            if choice != "1":
                data = eval(data)
    
            res = msg_dic[choice](data)
            print(res)
    # [{"backend":"www.oldboy1.org","record":{"server":"2.2.2.4","weight":"20","maxconn":"3000"}},{"backend":"www.oldboy1.org","record":{"server":"2.2.2.5","weight":"20","maxconn":"3000"}}]
    文件操作系统

     

  • 相关阅读:
    NS2 nam中节点及数据流颜色设置
    JSF简单介绍
    深入浅出谈开窗函数(一)
    BZOJ2440(全然平方数)二分+莫比乌斯容斥
    怎样在SharePoint管理中心检查数据库架构版本号、修补级别和修补程序的常规监控
    Java实现BASE64编解码
    博弈 个人 见解
    【剑指offer】第一个仅仅出现一次的字符
    cocos2d基础篇笔记四
    SSL连接建立过程分析(1)
  • 原文地址:https://www.cnblogs.com/hechengwei/p/9003413.html
Copyright © 2011-2022 走看看