Python 之解析

发布时间:2019-06-23 08:43:49编辑:auto阅读(1473)

    Python 之列表/字典/集合解析

    通过对列表/字典/集合每一个元素应用一个函数的方法将一个列表映射到另一个列表/字典/集合
    
    准备知识
        os (operating system) 模块
            os.getcwd()  获取当前工作目录
                >>> import os
                >>> print(os.getcwd())
                c:\Users\sreamy
            os.chdir()  切换工作目录(使用正斜杠)
                >>> import os
                >>> print(os.getcwd())
                c:\Users\sreamy
                >>> os.chdir('D:/')
                >>> print(os.getcwd())
                D:\
            os.stat() 获取文件元信息(文件创建时间,最后修改时间,文件大小等)
                >>> import os
                >>> print(os.getcwd())
                C:\Users\sreamy\.PyCharm2018.2\config
                >>> import glob
                >>> glob.glob('pycharm.*')
                ['pycharm.key']
                >>> metadata = os.stat('pycharm.key')   --> 获取文件元信息
                >>> metadata.st_mtime    -->   文件最后修改时间
                1554117802.3633113
                >>> import time
                >>> time.localtime(metadata.st_mtime)
                time.struct_time(tm_year=2019, tm_mon=4, tm_mday=1, tm_hour=19, tm_min=23, tm_sec=22, tm_wday=0, tm_yday=91, tm_isdst=0)
                >>> metadata.st_size     -->   文件大小(字节)
                6000
    
            os.path() 处理文件名和目录
            os.path.join() 从一个或多个路径中构造一个路径名
                >>> import os.path
                >>> os.path.join('c:/users/sreamy/.PyCharm2018.2/config/','pycharm.key')
                'c:/users/sreamy/.PyCharm2018.2/config/pycharm.key'   --> 路径名带/
                >>> print(os.path.join('c:/users/sreamy/.PyCharm2018.2/config/','pycharm.key'))
                c:/users/sreamy/.PyCharm2018.2/config/pycharm.key
                >>> os.path.join('c:/users/sreamy/.PyCharm2018.2/config/','pycharm.key')
                'c:/users/sreamy/.PyCharm2018.2/config/pycharm.key'
    
                >>> print(os.path.join('c:/users/sreamy/.PyCharm2018.2/config','pycharm.key'))
                c:/users/sreamy/.PyCharm2018.2/config\pycharm.key    --> 路径名不带/
                >>> os.path.join('c:/users/sreamy/.PyCharm2018.2/config','pycharm.key')
                'c:/users/sreamy/.PyCharm2018.2/config\\pycharm.key'
    
                >>> import os.path
                >>> print(os.path.expanduser('~'))
                C:\Users\sreamy           --> os.path.expanduser('~')  家目录路径
                >>> print(os.path.join(os.path.expanduser('~'),'.PyCharm2018.2','config','pycharm.key'))
                C:\Users\sreamy\.PyCharm2018.2\config\pycharm.key
    
            os.path.split()  拆分并返回目录名和文件名
            os.path.splitext()  拆分文件名并返回短文件名和扩展名
                >>> import os.path
                >>> pathname = 'C:/Users/sreamy/.PyCharm2018.2/config/pycharm.key'
                >>> (dirname,filename) = os.path.split(pathname)
                >>> dirname
                'C:/Users/sreamy/.PyCharm2018.2/config'
                >>> filename
                'pycharm.key'
    
                >>> (shortname,extension) = os.path.splitext(filename)
                >>> shortname
                'pycharm'
                >>> extension
                '.key'
    
            os.path.realpath() 构建文件按绝对路径
                >>> import os
                >>> print(os.getcwd())
                C:\Users\sreamy\.PyCharm2018.2\config
                >>> os.path.realpath('pycharm.key')
                'C:\\Users\\sreamy\\.PyCharm2018.2\\config\\pycharm.key'
                >>> print(os.path.realpath('pycharm.key'))
                C:\Users\sreamy\.PyCharm2018.2\config\pycharm.key
    
        glob  罗列目录内容|(使用通配符的方式)
                >>> import os
                >>> os.chdir('C:/Users/sreamy/.PyCharm2018.2')
                >>> import glob
                >>> glob.glob('config/*.pwd')
                ['config\\pdb.pwd']
                >>> os.chdir('C:/Users/sreamy/.PyCharm2018.2/config')
                >>> glob.glob('*port*.*')
                ['port.lock']
    
    列表解析
        通过对列表每一个元素应用一个函数的方法将一个列表映射到另一个列表
        提供一个紧凑的方式,可使用任何的Python 表达式
                >>> a_list = [1,2,4,8]
                >>> [elem ** 2 for elem in a_list]
                [1, 4, 16, 64]
                >>> a_list
                [1, 2, 4, 8]
    
                >>> import os,glob
                >>> os.getcwd()
                'C:\\Users\\sreamy\\.PyCharm2018.2\\config'
                >>> os.chdir('C:/users/sreamy/.PyCharm2018.2/config/tasks')
                >>> glob.glob('*.zip')
                ['fullstack.contexts.zip', 'fullstack.tasks.zip', 'untitled.contexts.zip', 'untitled.tasks.zip']
                >>> [os.path.realpath(f) for f in glob.glob('*.zip')]
                ['C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\fullstack.contexts.zip',
                'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\fullstack.tasks.zip',
                'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\untitled.contexts.zip',
                'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\untitled.tasks.zip']
    
                >>> import os,glob
                >>> os.getcwd()
                'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks'
                     ''' tasks 目录下所有zip文件的大小和绝对路径 '''
                >>> [[os.stat(f).st_size,os.path.realpath(f)] for f in glob.glob('*.zip')]
                [[139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\fullstack.contexts.zip'],
                 [139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\fullstack.tasks.zip'],
                 [35247, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\test.zip'],
                 [139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\untitled.contexts.zip'],
                 [139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\untitled.tasks.zip']]
                     ''' task 目录下所有ZIP 文件的大小和绝对路径且 文件大小需要小于1000 字节 '''
                >>> [[os.stat(f).st_size,os.path.realpath(f)] for f in glob.glob('*.zip') if os.stat(f).st_size < 1000]
                [[139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\fullstack.contexts.zip'],
                 [139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\fullstack.tasks.zip'],
                 [139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\untitled.contexts.zip'],
                 [139, 'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks\\untitled.tasks.zip']]
    
    字典解析
        和列表解析相似,返回的值是字典而已
                >>> import os,glob
                >>> os.getcwd()
                'C:\\users\\sreamy\\.PyCharm2018.2\\config\\tasks'
                >>> metadata_dict = {f:os.stat(f) for f in glob.glob('*.zip')}
                >>> type(metadata_dict)
                <class 'dict'>
                >>>
                >>> metadata_dict.keys()
                dict_keys(['fullstack.contexts.zip',
                           'fullstack.tasks.zip',
                           'test.zip',
                           'untitled.contexts.zip',
                           'untitled.tasks.zip'])
                >>> metadata_dict['fullstack.tasks.zip'].st_size
                139
        字典键 <--> 值交换
            >>> a_list = {'a':1,'b':2,'c':3}
            >>> {value:key  for key,value in a_list.items()}
            {1: 'a', 2: 'b', 3: 'c'}
            >>> a_list
            {'a': 1, 'b': 2, 'c': 3}
    
    集合解析
        和字典解析类似,字典是键值对,集合只有值
            >>> a_set = set(range(5))
            >>> a_set
            {0, 1, 2, 3, 4}
            >>> {x ** 2 for x in a_set}
            {0, 1, 4, 9, 16}
            >>> a_set
            {0, 1, 2, 3, 4}
            >>> {x for x in a_set if x % 2 == 1}
            {1, 3}
            >>> {x for x in range(8)}
            {0, 1, 2, 3, 4, 5, 6, 7}

关键字