• 饮冰三年-人工智能-Python-15Python基础之文件处理


    一、常用方法


     

    # 写文件--开始
    f=open('test','w',encoding="utf-8") #如果有则写,没有就创建
    print(f.writable())  #True
    f.write('11111
    ');
    f.writelines(['22222
    ','223333
    ']);
    f.write('33333
    ');
    f.close();
    # 写文件--结束
    
    # 读取文件--开始
    f=open('test',encoding="utf-8")
    # data=f.read();
    # print(data);
    print(f.readable())
    print(f.readline()) #一次读一行
    print(f.readlines()) #一次所有行
    f.close();
    # 读取文件--结束
    
    # 追加文件--开始 在光标处追加
    f=open('test','r+',encoding="utf-8")
    print(f.writable())  #True
    f.write('');
    f.writelines(['','223333
    ']);
    f.write('');
    f.close();
    # 追加文件--结束
    
    # 追加文件--开始 在光标处追加
    f=open('test','a',encoding="utf-8")
    print(f.writable())  #True
    f.write('在结尾追加
    ');
    f.writelines(['在结尾追加2
    ','在结尾追加3
    ']);
    f.close();
    # 追加文件--结束
    """输出结果
    一
    二
    223333
    三
    3333
    在结尾追加
    在结尾追加2
    在结尾追加3
    """
    文件处理1
    # 文件处理b模式
    #读取文件
    f=open("test",'rb');# 注意,通过二进制代开文件不用指定编码
    data = f.read().decode("utf-8");#但是读取的时候需要指定解码方式
    print(data)
    f.close()
    #写入文件
    f=open("test",'wb');# 注意,通过二进制代开文件不用指定编码
    f.write("张三
    ".encode("utf-8"))
    f.close();
    #追加文件
    f=open("test",'ab');# 注意,通过二进制代开文件不用指定编码
    f.write("李四
    ".encode("utf-8"))
    f.close();
    通过二进制处理文件
    # 读取文件最后一行
    f=open("test",'rb');# 注意,通过二进制代开文件不用指定编码
    
    for i in f:
        # 设置一个偏移量,offSet、
        offset=-10;
        while True:
            # 通过seek(偏移量,2);的方式来倒着获取光标位置
            f.seek(offset,2)
            # 从光标位置开始读取数据
            data=f.readlines();
            if len(data)>1:
                print(data[-1].decode('utf-8'));
                break;
            offset *=2
    读取文件最后一行
    with open('test','r',encoding="utf-8") as  a,open('test2','w',encoding="utf-8") as b:
        b.write(a.read())
    复制文件

    二、总结


     

      1:访问模式

        最基本的操作是读w、写r、追加a。

        b是表示以二进制方式读写,

        + 表示会一个查漏补缺,如果如果是r只读模式,r+就是变成读写模式    

    访问模式
      w r a
    b wb rb ab
    + w+ r+ a+
    b+ wb+ rb+ ab+

      2:注意

      • w模式,会把原来的内容删掉,然后再写入。慎用
      •  r+模式,直接写入:文件指针将会放在文件的开头。先读后写:文件指针将会放在文件的末尾。

        with open("r+有坑","w") as f:
            f.write("Hello,IO")
        ##此时文件内容为           Hello,IO
        
        # 直接使用r+的写功能
        with open("r+有坑","r+") as f:
            f.write("Hi,r+")
        ##此时文件内容为           Hi,r+,IO
        
        #结论一:打开一个文件用于读写。文件指针将会放在文件的开头。
        
        # 先读后写
        with open("r+有坑","r+") as f:
            print(f.read(3))  #Hi,
            f.write("Hi,r+")
        ##此时文件内容为               Hi, r +, IOHi, r +
        # 结论二:如果进行了读取操作,文件指针将会放在文件的末尾
        r+的指针位置

    三、练习:文件的修改


     

                                            古诗几首
    作者:李白
        题目《将进酒》
        题目《早发白帝城》
    
    作者:杜甫
        题目《登高》
        题目《兵车行》
    古诗几首
    #基本功能,实现对文件的增删改查
    msg="""1:查询,2:新增
    3:修改,4:删除"""
    #查询功能,根据输入的作者名称,查询该作者的作品
    def query(author):
        print('查询作者是:33[1;43m%s33[0m' %author)
        query_data='作者:%s'%author
        query_Result=[] #记录查询结果
        with open('古诗几首','r',encoding="utf-8") as read_f:
            tag=False
            for read_line in read_f:
                if read_line.strip()==query_data:
                    tag = True
                    continue
                elif read_line.strip()=="" and tag:
                    tag = False
                    break
                if tag:
                    print(read_line,end="")
                    query_Result.append(read_line)
            return query_Result
    
    def add():
        print("这是新增功能")
    def dele():
        print("这是删除功能")
    #这是修改功能
    #格式:修改需要提供一个list集合,包含两块内容
    # data=[{'作者':'李白','内容':'题目《将进酒》'},{'作者':'李白','内容':'题目《静夜思》'}]
    #修改之前,先判断文件是否存在
    def modify(data):
        #把拿到的data数据由字符串转换成列表
        data=eval(data)
        #拿到作者名称,调用Query方法,返回list集合
        article_list=query(data[0]["作者"])
        if not article_list :
            print('输入的作者不存在')
            return "输入的作者不存在"
        else:
            # 遍历得到的list集合,然后如果看看题目是否存在
            currentArticle= "    "+data[0]["内容"]+"
    "
            if currentArticle not in article_list:
                print('输入的作品不存在')
                return '输入的作品不存在'
            else:
                #如果输入的作品存在
                with open('古诗几首', 'r', encoding="utf-8") as read_f, 
                     open('古诗几首_新', 'w', encoding="utf-8") as write_f:
                    # 遍历文件。如果不是当前行,直接复制,如果是当前行,复制修改后的
                    for curLine in read_f:
                        if curLine.strip()!=currentArticle.strip():
                            write_f.write(curLine)
                        else:
                            currentArticlenew="    "+data[1]["内容"]+"
    "
                            write_f.write(currentArticlenew)
                    print("修改完成")
    dic_oper={'1':query,'2':add,'3':modify,'4':dele,}
    if __name__=='__main__':
        while True:
            print(msg)
            choice=input('请输入您的选项').strip()
            if not choice:continue
            if choice=="5":break
            data=input('请输入您的数据').strip()
            dic_oper[choice](data)
    文件处理
  • 相关阅读:
    明确架构目标
    是什么浪费了我的时间
    精益求精,抑或得过且过[转]
    web界面应用的十种常见技术
    我对软件优化的一些想法
    最新31个非常棒的 Photoshop 网页设计教程
    sql2005提示工具程序
    转载:一篇深入了解.NET中栈和堆较好的文章
    推荐18个非常棒的Web和移动开发框架
    介绍一下这些工具FishAspnetLoader
  • 原文地址:https://www.cnblogs.com/YK2012/p/9719684.html
Copyright © 2020-2023  润新知