-------------------接《python内置模块(一)》--------------------------------


四、json、pickle 数据序列化

    用于序列化的两个模块


    • json,用于字符串 和 python数据类型间进行转换

    • pickle,用于python特有的类型 和 python的数据类型间进行转换

        Json模块提供了四个功能:dumps、dump、loads、load

        pickle模块提供了四个功能:dumps、dump、loads、load

        # pickle.dumps 通过特殊的形式将数据转换成只有python能认识的字符串

    >>> import pickle

    >>> data = {'lihongye1':'pwd1','lihongye2':'pwd2'}

    >>> p_str = pickle.dumps(data)

    >>> print(p_str)

    或将字符串转换成只有python能认识的字符串存储在文件中

    test = { 'user':'lihongye','pwd':'pwd1','num':'123'}

    import pickle

    fw = open('test_file','wb')

    fw.write(pickle.dumps(test))

    通过pickle.loads 将字符串转成原数据形式

    import pickle

    fr = open('test_file','rb')

    frp = pickle.load(fr)

    print(frp)


    # 也可通过json.dumps方式将数据转成所有程序都能认识的字符串格式并写入文件

    test = { 'user':'lihongye','pwd':'pwd1','num':'123'}

    import json

    fw = open('test_file','w')

    fw.write(json.dumps(test))

    通过json.loads方式将字符串转换成原数据格式

    import json

    fr = open('test_file','r')

    frp = json.load(fr)

    print(frp)

五、 random

     随机数

     >>> import random

        >>> random.random()           # 随机小数

        0.7558096251338481

        >>> random.randint(1,3)       # 有范围的随机数1-3

        2

        >>> random.randrange(1,10)    # 有范围的随机数1-9

        1

     随机验证码实例
        import  random

        check_code = ''

        for i in range(4):

            current = random.randint(0,4)

            if current != i:

                tmp = str(chr(random.randint(65,90)))

            else:

                tmp = random.randint(0,9)

            check_code += str(current)

        print(check_code)

六、 subprocess 执行系统命令

    call 执行系统命令,如果命令正确则返回状态码,否则抛出异常

            >>> res = subprocess.call(['ls','-l'],shell=False)

             >>> res = subprocess.call(['ls -l'],shell=True)

            shell = True 调用系统平台执行命令;

      check_call 执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

        >>> res = subprocess.check_call(['ls -l'],shell=True)   结果是0

             >>> res = subprocess.check_call(['ls-l'],shell=True)    结果异常

      check_output 执行命令,如果执行状态码是 0 ,则返回结果,否则抛异常     

             >>> res = subprocess.check_ouput(['ls -l'],shell=True)   返回执行结果

             >>> res = subprocess.check_ouput(['ls-l'],shell=True)   结果异常

      Popen   用于执行更加复杂的系统命令

         可用参数:

             args:      shell命令,可以是字符串或者序列类型(如:list,元组)

             bufsize:   指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲

             stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄

             preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在

                         子进程运行之前被调用

             close_sfs: 在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承

                         父进程的输入、输出、错误管道。所以不能将close_fds设置为True同时重定向

                         子进程的标准输入、输出与错误(stdin, stdout, stderr)。

             shell:同上cwd:用于设置子进程的当前目录env:用于指定子进程的环境变量。如果env =                               None,子进程的环境变量将从父进程中继承。universal_newlines:不同系统的换行

                    符不同,True -> 同意使用 \nstartupinfo与createionflags只在windows下有效将被

                    传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,

                    进程的优先级等等                            

            >>>res=subprocess.Popen(['python3'],stdin=subprocess.PIPE,                                                 stdout=subprocess.PIPE,stderr=subprocess.PIPE)

            >>> res.stdin.write(b"print('hello1')\n")

            16

            >>> res.stdin.write(b"print('hello2')\n")

            16

            >>> res.stdin.write(b"print('hello3')\n")

            16

            >>> ret = res.communicate(timeout=10)

            >>> print(ret)

            (b'hello1\nhello2\nhello3\n', b'')

                     >>> res.pid

                     5722

                     >>> res.terminate()  会成为僵尸进程并与父进程失去联系  

                     root      5722  5633  0 10:19 pts/0    00:00:00 [python3] <defunct>

                     >>> res.wait()    完全释放掉资源

    更多点击这里

七、 shutil 高级文件、文件夹、压缩包处理模块

    shutil.copyfileobj(fsrc, fdst[, length])    将文件内容拷贝到另一文件

           fsrc 源文件  fdst 目标文件  length 每次拷贝长度(可有可无)

        >>> import shutil

        >>> s = open("smtp.py")

        >>> d = open("smtp_copy","w")

        >>> shutil.copyfileobj(s,d,length=20)

>>> d.close()

        [root@python ~]# cat smtp_copy

      shutil.copyfile(src, dst)  拷贝文件

        >>> import shutil

        >>> shutil.copyfile('smtp.py','smtp')

        [root@python ~]# ls smtp smtp.py 

        smtp  smtp.py

    shutil.copymode(src, dst)  仅拷贝权限。内容、组、用户均不变

            >>> shutil.copymode('smtp.py','smtp')

        [root@python ~]# ll smtp smtp.py 

        -rw-r--r-- 1 root root 1309 Jan 25 12:02 smtp

        -rw-r--r-- 1 root root 1309 Dec 28 01:30 smtp.py

           shutil.copystat(src, dst)       拷贝状态的信息,包括:mode bits, atime, mtime, flags

            >>> shutil.copystat('smtp.py','smtp')

        [root@python ~]# ll smtp smtp.py 

        -rw-r--r-- 1 root root 1309 Dec 28 01:30 smtp

        -rw-r--r-- 1 root root 1309 Dec 28 01:30 smtp.py

           shutil.copy(src, dst)         拷贝文件和权限

            >>> shutil.copy('smtp.py','smtp_copy')

        [root@python ~]# ll smtp smtp_copy 

        -rw-r--r-- 1 root root 1309 Dec 28 01:30 smtp

        -rw-r--r-- 1 root root 1309 Jan 25 12:19 smtp_copy

           shutil.copy2(src, dst)        拷贝文件和状态信息

            >>> shutil.copy2('smtp.py','smtp')

            [root@python ~]# ll smtp*

        -rw-r--r-- 1 root root 1309 Dec 28 01:30 smtp

        -rw-r--r-- 1 root root 1309 Dec 28 01:30 smtp.py

    shutil.ignore_patterns(*patterns)
           shutil.copytree(src, dst, symlinks=False, ignore=None)  
  递归的去拷贝文件

     >>> shutil.copytree('dir1','dir2')

     [root@python ~]# ll dir1

        total 4

        drwxr-xr-x 3 root root 4096 Jan 25 11:19 dir2

        [root@python ~]# ll dir2

        total 4

        drwxr-xr-x 3 root root 4096 Jan 25 11:19 dir2

    shutil.rmtree(path[, ignore_errors[, onerror]])     递归的去删除文件

     >>> shutil.rmtree('dir2')

        [root@python ~]# ll dir2

        ls: cannot access dir2: No such file or directory

    shutil.move(src, dst)                递归的去移动文件

     >>> shutil.move('dir1','/tmp')

        [root@python ~]# ll dir1

        ls: cannot access dir1: No such file or directory

        [root@python ~]# ll /tmp/dir1

        total 4

        drwxr-xr-x 3 root root 4096 Jan 25 11:19 dir2

    shutil.make_archive(base_name, format,...)

        创建压缩包并返回文件路径,例如:zip、tar

        base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前

                    目录,否则保存至指定路径,

                    如:www                        =>保存至当前路径

                    如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/

        format:    压缩包种类,“zip”, “tar”, “bztar”,“gztar”

        root_dir:  要压缩的文件夹路径(默认当前目录)

        owner:     用户,默认当前用户

        group:     组,默认当前组

        logger:    用于记录日志,通常是logging.Logger对象

    例:

     >>> shutil.make_archive('dir1_archive',format='zip',root_dir='/root/dir1')

        [root@python ~]# ll dir1*

        -rw-r--r-- 1 root root   22 Feb 21 04:04 dir1_archive.zip






---------------------------- 接 内置模块(三)------------------------------------