• python学习之文件读写,序列化(json,pickle,shelve)


    python基础

    文件读写  凡是读写文件,所有格式类型都是字符串形式传输

      只读模式(默认) r 

        f=open('a.txt','r')#文件不存在会报错
        print(f.read())#获取到文件所有内容
        f.close()#关闭文件

      读写模式 r+

        f=open('a.txt','r+')#文件不存在会报错,可读可写可追加
        f.write('123')#
        f.close()

      只写模式 w

        f=open('a.txt','w')#w会一打开文件未被清空,如果文件不存在会新建
        f.write('a','123456')
        f.close()#关闭文件

      写读模式 w+  

        f=open('a.txt','w+')#w会一打开文件未被清空,如果文件不存在会新建
        print(f.read())#
        f.close()

        追加写模式 a  

        f=open('a.txt','a')#可以追加写,不存在可以新建,但是不能读
        f.write('a','123456')
        f.close()#关闭文件

      追加读模式 a+

        f=open('a.txt','a+')#a+可读可写可追加文件内容,如果文件不存在会新建,
        print(f.read())#获取到文件所有内容
        f.write('a','123456
    ')#
    换行符,从文件取到代码中会隐藏换行符用strip方法处理
        f.write('b','123456
    ')
        f.seek(0)#文件指针移动至最前面
        f.flush()#清缓冲区,直接写入磁盘中,这样做会直接看到磁盘文件的数据,但是在正式环境中会造成大量io
        f.close()#关闭文件

        #如果有中文在f=open('a.txt','r',encoding='utf-8')

        #读取二进制文件在模式中加b 如f= open('123.avi','rb+')

        #f.flush()表示立刻把缓存区中的数据写到磁盘中

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

      read(write),readline(writeline),readlines(writelines)

        read()       获取文件所有内容到内存,如果是大文件内存放不下会造成溢出,同理write 

        print(f.readlines())       获取文件所有内容,并以每行字符串形式输出。如果是大文件内存放不下会造成溢出。内置for循环,同理writelines,如果是字符串,直接传字符串不用readlines或者

                   writelines,效率低

        print(f.readline())   获取文件首行内容,并以字符串形式输出,文件指针标记此次读取内容之后,如果再次readline,输出后面一行的内容,同理writeline

      文件读写与for  高效读取文件内容

        一、

        f=open('a.txt',encoding='utf-8')  #f称为文件对象,文件句柄
        for line in f:
          print(line)

        二、

    
    
        f=open('a.txt',encoding='utf-8')
        while True:
           line = f.readline()
           if line != '':
               print(line)
           else:
               break
       f.close()

         三、 

       f = open('product.json', 'r', encoding='utf-8')
        res = f.read()
       if len(res) == 0:
          print("文件为空")
       else:
          print(res)

      文件指针    

        f.seek(0)   #文件指针移动至最前面

        f,tell()      #记录当前指针位置

    #python监控access.log文件及tell与seek的混用
    import
    time point = 0 while True: with open('access.log', encoding='utf-8') as f: if f: point_action = f.seek(point) all_ip = [] for i in f: ip = i.split("-")[0] all_ip.append(ip) point = f.tell() all_ip_set = set(all_ip) for i in all_ip_set: if all_ip.count(i) > 200: print("被封ip为%s,次数为%s" % (i, all_ip.count(i))) time.sleep(60)

      文件修改

        方法1  简单粗暴小文件适用

        f = open('a.txt',encoding='utf-8')#打开文件
        res = f.read().replace('a','b')#读取文件内容,把文件中所有a替换成b
        f.close()#关闭文件
        f = open('a.txt','w',encoding='utf-8')#以w模式清空文件
        f.write(res)#再把内存中的修改好的文件写入文件句柄中,从而达到文件修改的目的
        f.close()

        方法2 简单粗暴,小文件适用

        f = open('a.txt','a+‘,encoding='utf-8')#以a+模式打开文件
        f.seek(0)#指针移动到最前面
        res = f.read().replace('a','b')#替换
        f.seek(0)#再把指针移到最前面,不然指针在末尾,清不掉文件内容了
        f.truncate()#清空文件内容
        f.write(res)#
        f.close()

        方法3 适用于大文件

        import os #导入模块
        f1 = open('a.txt',encoding='utf-8')#打开原来文件
        f2 = open('a.txt.bak','w',encoding='utf-8')打开修改文件
        for line in f:#循环
          new_line = line.replace('a','b')#替换
          f2.write(new_line)#写入修改文件
        f1.close()
        f2.close()
        os.remove('a.txt')#删除文件
        os.rename('a.txt.bak','a.txt')#文件重命名

      with用法   用with不需要close方法,with自动关闭 

    '''将a文件的内容写到b文件中'''
    with open('a.txt','r') as rf,open('b.txt','a+') as wf :
        for line in rf.read():
            wf.write(line)

    序列化  就是从内存写到硬盘的过程,反序列化就是从磁盘读到内存的过程,我们的代码其实电脑也不是很明白,只有转换成二进制,然后电脑自己再转换成机器语言才明白

    python处理json  查看json格式是否有问题 www.bejson.com

      r = '''{"a":1,"b":2,"c":3}'''#json串就是字符串

      import json #导入序列化json模块

      res = json.loads(r)#把json串变成字典,与load区别在于loads后面参数对应的是字符串,简单来说使用load可以直接操作数据库,不用read了。使用loads可以用read写到内存再进行下一步对数据库的操作

      res2=json.dumps(res)#把字典变成json串,与dump区别在于dumps后面参数对应的是字符串,简单来说使用dump可以直接操作数据库,不用read了。使用dumps可以用read写到内存再进行下一步对数据库的操作

         dumps参数  #indent缩进,中文避免乱码,ensure_ascii=False

           res2=json.dumps(res,indent=4,ensure_ascii=False)

      json处理的优劣:json模块只支持str,int ,tuple ,list ,dict的数据类型,因为数据传输到文本是json格式,所以支持的语言也是很多的

    python操作pickle

    test = {
      "port1": {
        "username": "小北",
        "password": 123456,
        "sex": "",
        "action": "sport"
      },
      "port2": {
        "username": "小爱",
        "password": 123456,
        "sex": "",
        "action": "dance"
      }
    }
    print(type(test)) #<class 'dict'>
    
    import pickle
    wf = open('pickle_test','wb')
    pickle.dump(test,wf)
    wf.close()
    rf = open('pickle_test','rb')
    p = pickle.load(rf)
    print(p)
    rf.close()
    res = pickle.dumps(test)
    print(res)
    
    print(pickle.loads(res))
    #pickle对象操作
    test = {
      "port1": {
        "username": "小北",
        "password": 123456,
        "sex": "",
        "action": "sport"
      },
      "port2": {
        "username": "小爱",
        "password": 123456,
        "sex": "",
        "action": "dance"
      }
    }
    class Fuc_test(object):
        def __init__(self,doc):
            self.doc = doc
    p = Fuc_test(test)
    print(p)#<__main__.Fuc_test object at 0x000000000241A668>
    
    import pickle
    wf = open('pickle_test','wb')
    pickle.dump(p,wf)#写入文件
    
    rf = open('pickle_test','rb')
    res = pickle.load(rf)#读文件
    print(res)#<__main__.Fuc_test object at 0x000000000241A6A0>
    print(res.doc)#{'port1': {'username': '小北', 'password': 123456, 'sex': '男', 'action': 'sport'}, 'port2': {'username': '小爱', 'password': 123456, 'sex': '女', 'action': 'dance'}}

      pickle的优劣:pickle支持python里的所有数据类型,包括所有对象,但是缺点是只能在python里使用

     

    python操作shelve    shelve模块是对pickle的封装,其继承了只能在python里使用的缺点,但实现了dumps,loads多次的情况

    import shelve
    res =shelve.open('shelve')
    #字段新增
    res['dict'] = test
    print(res.get('dict'))#{'port1': {'username': '小北', 'password': 123456, 'sex': '男', 'action': 'sport'}, 'port2': {'username': '小爱', 'password': 123456, 'sex': '女', 'action': 'dance'}}
    
    #字段修改
    res['username'] = 'niao'
    print(res.get('username'))#niao
    res['username'] = 'nihao'#注意字段修改只能在修改整条字段的value进行覆盖,不能改value里面的某一个值
    print(res.get('username'))#nihao
    
    
    #字段删除
    res['password'] = '123456'
    print(res.get('password'))#123456
    res.pop('password')
    print(res.get('password'))#None
    
    #字段查看
    for i,j in res.items():#循环打印res对象中所有键值对
        print(i,j)
    res.close()  #关闭对象

      shelve模块的优劣:一样是只能对python操作,其本身对数据增加了key,value,key必须为字符串,key可以为任何数据类型,只要是持久化成为了其优势

    文件处理小妙招

      复制文件内容

      with open('b.txt', 'w', encoding='utf-8') as f2:
          with open('a.txt', 'r', encoding='utf-8') as f1:
              for line in f1:
                  f2.write(line)

       取文件内容

        s = ''
        f = open('product.txt', 'r', encoding='utf-8')
        for line in f:
            if line == '':
                print("内容为空")
            else :
                s = s + line
        print(s)

     版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    【转】动态模型及其求解介绍–番外篇
    【转】动态模型及其求解介绍—下
    Belief propagation
    隐马尔科夫模型(Hidden Markov Models) 系列之一
    隐马尔科夫模型(Hidden Markov Models) 系列之四
    【PGM】factor graph,因子图,势函数potential function,Template models
    词语搭配系统
    PHP Catalan数的几个应用
    PHP 求链表并集
    PHP 输入n,判断从1~n序列中十进制数里1出现的次数
  • 原文地址:https://www.cnblogs.com/RainBol/p/9573361.html
Copyright © 2020-2023  润新知