• python基础4-常见模块


    前言1:模块是什么?

      模块,用一系列代码实现了某个功能的代码集合。

      类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

    前言2:模块以怎样的方式存在的?

      存在方式:
        1.存在.py文件里面
        2.存在"某某"文件夹里面(但是文件里面必须包含__init__.py文件)

        如:os 是系统相关的模块;file是文件操作相关的模块

    前言3:模块的种类有哪几种?

    模块分为三种:
      自定义模块
      内置模块
      开源模块
      自定义模块

    1、定义模块(多个.py文件包含在一个文件夹里面,要想直接导入使用这个文件夹作为包,必须在里面建一个__init_.py,有无代码都没关系,如下图所示)

     

    2、导入模块,导入模块其实就是告诉Python解释器去解释那个py文件

    Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入。导入模块有一下几种方法:

    import module
    from module.xx.xx import xx功能
    from module.xx.xx import xx as rename #取别名
    from module.xx.xx import *
    

    注意:
    1.多个.py文件包含在一个文件夹里面,要想直接导入使用这个文件夹作为包,必须在里面建一个__init_.py,有无代码都没关系。
    2.导入一个包,解释器解释该包下的 __init__.py 文件


    导入模块时是根据那个路径作为基准来进行的呢?即:sys.path

    import sys
    print sys.path
    
    结果:
    ['E:\Code\Py.Code\PY4\py1123', 'E:\Code\Py.Code\PY4', 'C:\Windows\system32\python27.zip', 'C:\Python27\DLLs', 'C:\Python27\lib', 'C:\Python27\lib\plat-win', 'C:\Python27\lib\lib-tk', 'C:\Python27', 'C:\Python27\lib\site-packages']

    如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加。
    通过os模块可以获取各种目录,例如:

    ================
    import sys
    import os
    
    pre_path = os.path.abspath('../')
    sys.path.append(pre_path)
    ===================
    

      

    3.开源模块

    开源模块是怎么下载安装的呢?

    下载安装有如下两种方式:

    方式1:

    yum 
    pip
    apt-get
    ...
    

    方式2:

    下载源码
    解压源码
    进入目录
    编译源码 python setup.py build
    安装源码 python setup.py install
    注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行:
    
    yum install gcc
    yum install python-devel
    或
    apt-get python-dev
    安装成功后,模块会自动安装到 sys.path 中的某个目录中,如:
    
    
    /usr/lib/python2.7/site-packages/
    安装成功后,模块会自动安装到 sys.path 中的某个目录中,如:
    
    /usr/lib/python2.7/site-packages/
    

     

    常见模块总结(os、sys、hashlib、json和pickle、re、time、random)

    一、os----用于提供系统级别的操作

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径<====>pwd
    >>> import os
    >>> os.getcwd()
    '/root'
    >>> os.chdir("/mnt")
    >>> os.getcwd()
    '/mnt'
    >>> os.chdir("/root")
    

      

      
    os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
    os.curdir 返回当前目录: <=====>('.') 
    os.pardir 获取当前目录的父目录字符串名:<=====>('..')
    os.makedirs('dirname1/dirname2') 可生成多层递归目录
    os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove() 删除一个文件
    os.rename("oldname","newname") 重命名文件/目录
    os.stat('path/filename') 获取文件/目录信息
    os.sep 自动输出当前操作系统特定的路径分隔符,<=====>win下为"\",Linux下为"/"
    os.linesep 输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    os.pathsep 输出用于分割文件路径的字符串(分割文件的绝对路径使用,分割路径和文件名)
    os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command") <=====> 运行shell命令,直接显示,拿不回它的返回值
    os.environ 获取系统环境变量
    os.path.abspath(path) 返回path规范化的绝对路径,path----> "相对路径名"
    os.path.split(path) 将path分割成目录和文件名二元组返回,path--->"/root/python"
    os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path) 如果path是绝对路径,返回True
    os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
    os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回一个字符串,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
    

      


    二、sys---用于提供对解释器相关的操作

    sys.argv 以List的方式返回命令行参数,第一个元素是程序本身路径
    sys.exit(n) 退出程序,正常退出时exit(0),非正常exit(n),n不为0
    sys.version 获取Python解释程序的版本信息
    sys.maxint 最大的Int值
    sys.maxunicode 最大的Unicode值
    sys.path 返回python寻找模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform 返回操作系统平台名称
    sys.stdout.write('please:') #在python-shell中输出括号里的信息但不换行
    val = sys.stdin.readline()[:-1] ===>raw_input()
    

      


    三、hashlib ---关于加密的模块

    =============================
    import hashlib
    hash = hashlib.md5() #以md5的方式进行加密,这里md5可以换成sha算法(sha1,sha256,sha384,sha512)
    hash.update('jachy') #加密的内容为jachy
    print hash.hexdigest() #打印加密生成的密钥
    ea3c504ef548c2b435435975665b3f3c
    ============加入key弥补存在缺陷,即:通过网上专门有人撞库可以反解。所以有必要对加密算法中添加自定义key再来做加密。====================
    >>> import hashlib
    >>> hash = hashlib.md5('the key') #在hashlib.md5('要加的key信息')自定义
    >>> hash.update('tanjie')
    >>> print hash.hexdigest()
    5cdfcbac297e0116513da99fc7429ade
    =========================
    

      


    四、json 和 pickle,主要用于序列化

      json,用于字符串 和 python数据类型间进行转换
      pickle,用于python特有的类型 和 python的数据类型间进行转换


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

    =========pickle示例============
    >>> import pickle
    >>> data = {'k1':123,'k2':'hello'}
    >>> p_str = pickle.dumps(data) #将数据用特殊的形式转化成python语言认识的字符串
    >>> print p_str
    (dp0
    S'k2'
    p1
    S'hello'
    p2
    sS'k1'
    p3
    I123
    s.
    
    >>> with open('/root/txt','w') as fp: #将data转换成p_str的形式里(即python语言任何的字符串)面的内容写入到/root/txt文件里面
    ... pickle.dump(data,fp)
    ============json的运用====================
    >>> import json
    >>> j_str = json.dumps(data) #将data转换成任何语言都任何的字符串
    >>> print j_str 
    >>> with open('/root/txt1','w') as fp: #将data转换成任何语言都任何的字符串并将字符串写入到/root/txt1文件里面
    ... json.dump(data,fp)
    ... 

    五、re,re模块用于对python的正则表达式的操作。

    字符:

      . 匹配除换行符以外的任意字符
      w 匹配字母或数字或下划线或汉字
      s 匹配任意的空白符
      d 匹配数字
       匹配单词的开始或结束
      ^ 匹配字符串的开始
      $ 匹配字符串的结束

    次数:

      * 重复零次或更多次
      + 重复一次或更多次
      ? 重复零次或一次
      {n} 重复n次
      {n,} 重复n次或更多次
      {n,m} 重复n到m次

    示例:匹配IP和匹配手机号

    IP:
    ^(25[0-5]|2[0-4]d|[0-1]?d?d)(.(25[0-5]|2[0-4]d|[0-1]?d?d)){3}$
    手机号:
    ^1[3|4|5|8][0-9]d{8}$
    

    re模块的常见方法:

    1、match(pattern, string, flags=0)

    从起始位置开始根据模型去字符串中匹配指定内容,匹配单个

    正则表达式,要匹配的字符串,标志位(用于控制正则表达式的匹配方式)

    import re
    
    obj = re.match('d+', '123uuasf')
    if obj:
        print obj.group()
    

      

    2、search(pattern, string, flags=0)

    根据定义的模式去字符串中匹配指定内容,匹配单个

    import re
    
    obj = re.search('d+', 'u123uu888asf')
    if obj:
    print obj.group()
    
    
    a = "123abc456"
    print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group()
    
    print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0)
    print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1)
    print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2)
    

      

    3、group和groups

    print re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()
    

      

    4、findall(pattern, string, flags=0)

    上述两中方式均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。

    >>> import re
    
    >>> obj = re.findall('d+','adfasd324234dasf') #以列表的形式返回
    >>> print obj
    ['324234']
    

      

    5、sub(pattern, repl, string, count=0, flags=0)

    用于替换匹配的字符串,相比于str.replace功能更加强大

    >>> content = "123afadf342"
    >>> new_content = re.sub('d+','F',content) #将匹配到的内容用F替换
    >>> print new_content
    FafadfF
    
    >>> new_content = re.sub('d+','F',content,1) #将第一次匹配到的内容用F替换
    >>> print new_content
    Fafadf342
    
    content = "123abc456"
    new_content = re.sub('d+', 'sb', content)
    # new_content = re.sub('d+', 'sb', content, 1)
    print new_content
    

      

    6、split(pattern, string, maxsplit=0, flags=0)

    根据指定匹配进行分组,相比于str.split更加强大

    >>> content = "'1-2 * (60-30+1*(9-2*5/3))'"
    >>> new_content = re.split('*',content) #*用于转义*,这里是指用*将字符串分割,并以列表的形式返回
    >>> print new_content
    ["'1-2 ", ' (60-30+1', '(9-2', "5/3))'"]
    
    >>> new_content = re.split('*',content,1) #按第1个*进行分割,并以列表的形式返回
    >>> print new_content
    
    ["'1-2 ", " (60-30+1*(9-2*5/3))'"]
    
    c>>> new_content = re.split('[+-*/]+',content) #按+ - * /将整个字符进行分割
    >>> print new_content
    ["'1 ", ' 2 ', ' ((60', '30', '1', '(9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14))', '(', '4', '3)', '(16', '3', "2) )'"]
    >>> new_content = re.split('[+-*/]+',content,1) #按+ - * /将整个字符进行分割,只分割第1个
    >>> print new_content
    ["'1 ", " 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'"]
    
    inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
    inpp = re.sub('s*','',inpp)
    new_content = re.split('(([+-*/]?d+[+-*/]?d+){1})', inpp, 1)
    print new_content
    

      


    六.执行系统shell命令相关的模块
    1.subprocess模块
      1.call方法

    =================================================
    >>> ret = subprocess.call("cat txt",shell=True)	
    >>subprocess.call(["ls","-l"],shell=False)) 
    注意:shell==True表示允许shell命令时字符串形式
    ================================================
    

     

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

    =================================================
    subprocess.check_call(["ls", "-l"])
    subprocess.check_call("exit 1", shell=True)
    =================================================
    

      

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

    =================================================
    subprocess.check_output(["echo", "Hello World!"])
    subprocess.check_output("exit 1", shell=True)
    =================================================
    

      

      4.Popen命令,用于执行复杂命令

    ==================================================
    >>> ret1 = subprocess.Popen(["mkdir","t1"]) #创建在当前目录下,创建名为t1的目录
    >>> ret2 = subprocess.Popen("mkdir t2",shell=True) #创建在当前目录下,创建名为t1的目录
    ===================================================
    
    ======================指明当前目录cwd为/root/python======================
    >>> obj = subprocess.Popen("mkdir t3",shell=True,cwd='/root/python',)
    

      

    2、shutil模块,高级的 文件、文件夹、压缩包 处理模块
      1.shutil.copyfileobj(fsrc, fdst[, length])
      将文件内容拷贝到另一个文件中,可以部分内容


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


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


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


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

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


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

    例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))


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


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

      10.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: 组,默认当前组

    =====================================================
    
    #将 /Users/Downloads/test 下的文件打包放置当前程序目录
    
    import shutil
    ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/Downloads/test')
    
    
    #将 /Users/Downloads/test 下的文件打包放置 /Users/目录
    import shutil
    ret = shutil.make_archive("/Users/wwwwwwwwww", 'gztar', root_dir='/Users/Downloads/test')
    

      


    七.ConfigParser

    示例:
    >>> import ConfigParser,sys
    >>> config = ConfigParser.ConfigParser() #创建ConfigParser对象
    >>> config.add_section("message") #添加section,即[message]
    >>> config.set("message","name","jachy") #然后为section添加内容1:name = jachy
    >>> config.set("message","age","22") #添加内容2:age = 22
    >>> config.add_section("address") #添加第二个section,即[address]
    >>> config.set("address","address","sichuan") #然后为setcion添加内容1:address = sichuan
    >>> config.write(sys.stdout) #然后写入配置文件,并输入到终端上
    [message]
    name = jachy
    age = 22
    
    [address]
    address = sichuan
    
    >>> config.items('message') #从section(这里指的是message)中读取内容,并以列表的形式返回
    [('name', 'jachy'), ('age', '22')]
    >>> config.items('address')
    [('address', 'sichuan')]
    
    >>> config.remove_option('address','address') #从section中(这里指address)移除address选项信息
    True
    >>> config.write(sys.stdout)
    [message]
    name = jachy
    age = 22
    
    [address]
    
    
    >>> config.add_section("phone") #增加section信息,这里指phone
    >>> config.write(sys.stdout)
    [message]
    name = jachy
    age = 22
    
    [address]
    
    [phone]
    
    >>> config.set('phone','k1','v1') #向section中的phone增加option信息:k1 = v1
    >>> config.write(sys.stdout) 
    [message]
    name = jachy
    age = 22
    
    [address]
    
    [phone]
    k1 = v1
    
    
    >>> config.remove_option('phone','k1') #从section中:phone,里面移除option:k1
    True
    >>> config.write(sys.stdout)
    [message]
    name = jachy
    age = 22
    
    [address]
    
    [phone]
    
    >>> config.write(open('t1.txt','w')) #将config里面的信息写入到t1.txt文件中
    [root@localhost ~]# cat t1.txt 
    [message]
    name = jachy
    age = 22
    
    [address]
    
    [phone]
    

      

    八.time模块,时间相关的操作,时间有三种表示方式:

    1.时间戳 1970年1月1日之后的秒,即:time.time()
    2.格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
    3.结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()

    =================================
    >>> import time
    >>> time.time()
    1448509967.387637
    >>> time.strftime('%Y-%m-%d')
    '2015-11-26'
    >>> time.localtime()
    time.struct_time(tm_year=2015, tm_mon=11, tm_mday=26, tm_hour=11, tm_min=53, tm_sec=37, tm_wday=3, tm_yday=330, tm_isdst=0)
    
    >>> import datetime
    >>> print datetime.datetime.now() #打印当前的时间
    2015-11-26 16:41:33.462807
    

      

    九.random模块

    >>> import random
    >>> print random.random() #生成随机数
    0.636789536881 
    >>> print random.random()
    0.0304092540837
    
    >>> print random.randint(1,2) #在1-2之间生成随机整数
    2
    >>> print random.randint(1,2)
    2
    >>> print random.randint(1,10) #在1-10之间生成随机整数
    6
    >>> print random.randint(1,10)
    3
    

      

  • 相关阅读:
    命令模式
    js代理模式,处理缓存
    js设计模式之策略模式
    查看并修改签名证书keystore的密码,alias别名等相关参数
    【fiddler】配置代理后个别app连不上网的问题
    使用Fiddler域名过滤、断点、小技巧绕过前端验证
    App上架各大应用市场的地址及操作方法
    获取APK获取APK证书MD5、SHA1、SHA256等秘钥
    Python一切皆对象
    WEB基础之布局与定位
  • 原文地址:https://www.cnblogs.com/jachy/p/5000060.html
Copyright © 2020-2023  润新知