• python文件处理--笔记


       之前一段时间一直在忙着写毕业论文,盲评搞得人心惶惶,以致于都没有看书,最近需要补上前面落下的东西。

    《Python3程序开发指南》

    1、二进制数据的读写

    二进制格式通常是占据磁盘空间最小、保存与加载速度最快的数据格式。最简单的方法是使用pickle

       pickle模块主要提供了数据持久化功能

      序列化可使用dumps()函数,逆序列化使用loads()函数,将文件中的数据解析为一个python对象。

      现有5种版本的pickle模块,分别为0到4

      pickle模块提供的常量:

      pickle.HIGHEST_PROTOCOL:整型,最高协议版本

      pickle.DEFAULT_PROTOCOL:序列化中默认的协议版本,可能会低于HIGHEST_PROTOCOL,目前默认协议为3

    pickle模块提供的函数:

      1、pickle.dump(obj,file,protocol=None,*,fix_imports=True)

         将对象obj保存到文件file中,等同于Pickler(file,protocol).dump(obj)

        参数说明:  

            obj:将要封装的对象

            protocol:整型,协议版本号,支持的版本号为0到HIGHEST_PROTOCOL,如果没有指定,默认为DEFAULT_PROTOCOL。如果指定为负数,则为HIGHEST_PROTOCOL。

            file:obj将要写入的文件对象,file必须以二进制可写模式打开,即“wb”,该file参数必须有write()方法,该方法能够接受单字节的参数。

           fix_imports:如果fix_imports为true,并且协议版本小于3,那么pickle将python3对应到python2

      2、pickle.dumps(obj)

          以字节对象形式返回封装的对象,不需要写入文件中

      3、pickle.load(file,*,fix_import=True,encoding="ASCII",errors="strict")

        从file中读取一个字符串,并将它重构为原来的python对象

             file:必须以二进制可读模式打开,即“rb“,其余为可选参数,有read()和readline()接口

         等同于Unpickler(file).load()

      4、pickle.loads(bites_object)

         从字节对象中读取被封装的对象,并返回pickle模块可能出现的三种异常

       1、 带可压缩的Pickle

            Pickle提供了从python程序中保存数据(或向python程序加载数据)的最简单方法。Pickle没有安全机制(没有机密、没有数字签名)。之所以有安全问题,是因为pickle可以导入任意模块并调用任意函数,因此来自不可信源的pickle中的数据可能会被恶意操作。但pickle是处理ad hoc数据的理想选择,针对个人用途的程序更是如此。

    pickle.dump(obj,file[,protocol])       

            如果要求压缩,可使用gzip.open()打开文件,否则使用内置的open()函数。

            二进制模式pickling数据时,必须使用“二进制写”模式(wb)

           错误处理选择的方式:只要发生错误立即向用户报告,并向调用者返回一个布尔值,以表示成功还是失败。

           finally语句块确保文件被关闭

    import pickle
    import gzip
    def export_pickle(self,filename,compress=False):
        fh = None
        try:
            if compress:
                fh = gzip.open(filename,"wb")
            else:
                fh = open(filename,"wb")
            pickle.dump(self,fh,pickle.HIGHEST_PROTOCOL)
            return True
        except (EnvironmentError,pickle.PickleError) as err:
            print("{0}:export error:{1}".format(os.path.basename(sys.argv[0]),err))
            return False
        finally:
            if fh is not None:
                fh.close()
                
        
    

      

    2、struct模块

      在python中,需要处理二进制数据,比如在存取文件、socket通信时,这时可以通过struct模块来实现,对此,我翻阅了一些很不错的博客,就不在此班门弄斧。后面会转载一些来学习。

       struct模块中,最重要的三个函数:pack(), unpack(), calcsize()。还提供了struct.Struct()类。

       struct.pack():

               参数:一个struct格式化字符串,一个或多个值

               返回:一个bytes对象,其中存放的是按照该格式规范表示的所有这些参数值。

       struct.unpack():

               参数:一个格式化规范,以及一个bytes或bytearray对象

               返回:一个元组,其中的值原本使用该格式规范进行了打包

    >>> import struct
    >>> data=struct.pack("<2h",11,-9)
    >>> data
    'x0bx00xf7xff'
    >>> items=struct.unpack("<2h",data)
    >>> items
    (11, -9)
    >>> 
    

     struct.calcsize():

              参数:以一个数规范为参数

              返回:使用该格式规范的struct所占据的字节数。

    格式规范也可以通过创建一个struct.Struct()对象存储(将该格式规范作为其参数),而struct.Struct()对象的大小则由其size属性指定。

    >>> TWO_SHORTS = struct.Struct("<2h")
    >>> data=TWO_SHORTS.pack(11,-9)
    >>> items=TWO_SHORTS.unpack(data)
    >>> data
    'x0bx00xf7xff'
    >>> items
    (11, -9)
    

      

  • 相关阅读:
    精选微软经典的算法面试100题
    C++高效程序设计
    算法导论第五章:概率分析和随机算法
    算法导论第六章:堆排序
    算法导论第八章:线性时间排序
    算法导论第六章:堆排序
    算法导论第七章:快速排序
    M0n0wall安装及配置教程(上)
    ASP.NET十分有用的页面间传值方法
    PC网络配置切换脚本(IP地址切换脚本)
  • 原文地址:https://www.cnblogs.com/xiao--yao/p/5034476.html
Copyright © 2020-2023  润新知