• python之路第五篇之模块和加密算法(进阶篇:续)


    模块

    Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中有一个概念叫做模块(module)

    简单地说,模块就是一个保存了Python代码的文件。
    

    模块分类;

    1)内置模块
    
    2)自定义模块
    
    3)第三方模块
    

    模块存在方式:

    “.py”  
    "文件夹"
    

    paramiko 模块(这个模块需要安装,具体安装方法很简单,这里不做说明)

    用途:linux 主机远程 用到这个模块

    模块的导入

    在Python中用关键字import来引入某个模块,比如要引用sys这个模块,就可以在文件最开始的地方用import sys 来导入.

    在调用sys模块中的函数时,必须这样引用:

     模块名.函数名
    

    为什么必须加上模块名这样调用呢?

    因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数,所以如果像上述这样引入模块的时候,调用函数必须加上模块名。

    模块导入方式一:

    import sys      #导入模块
    
    print argv      #这样会报错
    print sys.argv  #这样才会输出正常结果
    

    但是有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,可以使用如下方法:

    模块导入方式二:

    from 模块名 import 函数名1,函数名2....
    
    from sys import argv   #导入模块
    print argv
    

    模块导入方式三:

    from 模块名 import *
    
    from sys import *  #导入模块 (这种方式不推荐)
    print sys
    

    模块重命名:

    from 模块名 import 函数名 as 新名字
    form sys import argv as test
    print test
    

    模块的获取几种方式:

    1.自己写
    2.内置
    3.下载
    

    自定义模块:

    如何导入自定义模块?

    1.将自定义的模块导入到python模块默认路径中,然后通过 “import 模块名” 导入

    通过如下方式可以获取模块路径,然后将模块导入到这个路径中即可:

    >>> import sys
    >>> sys.path
    ['', '/Library/Python/2.7/site-packages/pip-0.7.2-py2.7.egg', 
    '/Library/Python/2.7/site-packages/redis_py_cluster-1.0.0-py2.7.egg', 
    '/Library/Python/2.7/site-packages/redis-2.10.3-py2.7.egg', 
    '/Library/Python/2.7/site-packages/paramiko-1.10.1-py2.7.egg', 
    '/Library/Python/2.7/site-packages', '/System/
    .....
    '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
    /plat-darwin', '/'/Library/Python/2.7/site-packages']
    

    因为我的是Mac 电脑,所以python 默认是这个路径:'/Library/Python/2.7/site-packages'

    2.通过 追加的方式,动态的导入自定义的模块的路径 到python默认模块路径中:

    import sys     
    sys.path.append('/home/ec2-user/')   #将这个模块实际存放路径加载到 python模块默认路径
    
    import test #(test.py 这个文件存在在/home/ec2-user/目录下,则可以通过这种方法)
    

    注意:

    如果需要导入一个新建的目录,则这个目录下需要存在一个__init__.py 文件:
    
    __init__.py: 是个特殊的py文件,在python中,这个也就是文件夹及模块包的区别 
    
    

    内置模块:

    os模块:用于提供系统级别的操作

    os.getcwd()                #获取当前工作目录,即当前python脚本工作的目录路径
    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规范化的绝对路径
    os.path.split(path)                 #将path分割成目录和文件名二元组返回
    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)
    sys.version                #获取Python解释程序的版本信息
    sys.maxint                 #最大的Int值
    sys.path                   #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform               #返回操作系统平台名称
    sys.stdout.write('please:')
    val = sys.stdin.readline()[:-1]
    

    详细执行:

    >>> os.getcwd()
    '/Users/yangallen214'
    
    >>> os.chdir('/Users/yangallen214/Desktop')
    >>> os.getcwd()
    '/Users/yangallen214/Desktop'
    
    >>> os.curdir
    '.'
    
    >>> os.curdir
    '.'
    >>> os.pardir
    '..'
    
    >>> os.makedirs('./test/test1')
    >>> os.listdir('./test')
    ['test1', 'yangyh', 'yangyh.zip']
    
    >>> os.removedirs('./test/test1')
    >>> os.listdir('./test')
    ['yangyh', 'yangyh.zip']
    
    >>> os.mkdir('./test/test1')
    >>> os.rmdir('./test/test1')
    >>> os.listdir('./test')
    ['yangyh', 'yangyh.zip']
    
    >>> os.makedirs('./test1111/test11')
    >>> os.listdir('./test1111/')
    ['test11']
    >>> os.remove('./test1111/test11')   #报错,是因为它只能删除文件
    Traceback (most recent call last): 
      File "<stdin>", line 1, in <module>
    OSError: [Errno 1] Operation not permitted: './test1111/test11'
    
    >>> os.rename('./test1111/test11','./test1111/test12')
    >>> os.listdir('./test1111')
    ['test12']
    
    >>> os.stat('./test1111/test12')
    posix.stat_result(st_mode=16877, st_ino=15556867, st_dev=16777220L, st_nlink=2,
    st_uid=501, st_gid=20, st_size=68, st_atime=1448451416, st_mtime=1448451416, 
    st_ctime=1448451416)
    
    >>> os.sep
    '/'
    >>>
    >>> os.linesep
    '
    '
    >>> os.pathsep
    ':'
    >>> os.name
    'posix'
    
    >>> os.system('pwd')
    /Users/yangallen214
    0
    
    >>> os.environ
    {'VERSIONER_PYTHON_PREFER_32_BIT': 'no', 'LOGNAME': 'yangallen214', 'USER': 
    'yangallen214', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/
    .....
    
    >>> os.path.abspath('./test1111')
    '/Users/yangallen214/test1111'
    
    >>> os.path.split('./Desktop')
    ('.', 'Desktop')
    
    >>> os.path.dirname('./Desktop')
    '.'
    >>> os.path.basename('./Desktop')
    'Desktop'
    
    
    >>> os.path.exists('./test1111/aa.txt')
    False
    
    >>> os.path.isabs('./Desktop')
    False
    >>> os.path.isabs('/Users/yangallen214/Desktop')
    True
    
    >>> os.path.isfile('./test1111/aa.txt')
    False
    
    >>> os.path.join('/Users/yangallen214/Desktop','./test1111/test12')
    '/Users/yangallen214/Desktop/./test1111/test12'
    >>> os.path.join('/Users/yangallen214/Desktop','/test1111/test12')
    '/test1111/test12'
    >>>
    >>> os.path.join('/Users/yangallen214/Desktop','./test1111/test12','./test/')
    '/Users/yangallen214/Desktop/./test1111/test12/./test/'
    >>> os.path.join('/Users/yangallen214/Desktop','./test1111/test12','/test/')
    '/test/'
    
    >>> os.path.getatime('./test1111')
    1448451671.0
    >>> os.path.getmtime('./test1111')
    1448451657.0
    
    
    >>> import sys
    >>> sys.argv
    ['']
    
    >>> sys.version
    '2.7.6 (default, Sep  9 2014, 15:04:36) 
    [GCC 4.2.1 Compatible Apple LLVM 6.0
     (clang-600.0.39)]'
    >>> sys.maxint
    9223372036854775807
    >>> sys.platform
    'darwin'
    

    ConfigParser 模块

    用于对特定的配置进行操作

    ConfigParser方法:

    1、config=ConfigParser.ConfigParser()  
    创建ConfigParser实例  
      
    2、config.sections()  
    返回配置文件中节序列  
      
    3、config.options(section)  
    返回某个项目中的所有键的序列  
      
    4、config.get(section,option)  
    得到section中option的值,返回为string类型
      
    5、config.add_section(str)  
    添加一个配置文件节点(str)
      
    6、config.set(section,option,val)  
    设置section节点中,键名为option的值(val)  
      
    7、config.read(filename)  
    读取配置文件  
      
    8、config.write(obj_file)  
    写入配置文件  
    
    9、config.items(section) 
    得到该section的所有键值对
    
    
    >>> import ConfigParser,sys
    >>> 
    >>> config=ConfigParser.ConfigParser()
    >>> config.add_section("mybook")
    >>> config.set("mybook","title","This is mytitile")
    >>> config.set("mybook","author","Allen")
    >>> config.add_section("size")
    >>> config.set("size","size",1024)
    >>> config.write(sys.stdout)    #执行结果如下
    [mybook]
    title = This is mytitile
    author = Allen
    
    [size]
    size = 1024
    

    Python hashlib和hmac模块

    Python中用于加密的函数位于hashlib,hmac模块中,都是内置模块,直接导入即可使用

    hashlib模块实现了md5,sha1,sha224,sha256,sha384,sha512等算法,
    可以hashlib.algorithms查看

    hmac模块实现了hmac算法,需要一个key来进行加密

    查看可用的加密方式:

    >>> import hashlib
    >>> hashlib.
    hashlib.__all__                     hashlib.__getattribute__(           hashlib.__repr__(                   hashlib.new(
    hashlib.__class__(                  hashlib.__hash__(                   hashlib.__setattr__(                hashlib.sha1(
    hashlib.__delattr__(                hashlib.__init__(                   hashlib.__sizeof__(                 hashlib.sha224(
    hashlib.__dict__                    hashlib.__name__                    hashlib.__str__(                    hashlib.sha256(
    hashlib.__doc__                     hashlib.__new__(                    hashlib.__subclasshook__(           hashlib.sha384(
    hashlib.__file__                    hashlib.__package__                 hashlib._hashlib                    hashlib.sha512(
    hashlib.__format__(                 hashlib.__reduce__(                 hashlib.algorithms
    hashlib.__get_builtin_constructor(  hashlib.__reduce_ex__(              hashlib.md5(
    >>> hashlib.algorithms
    ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
    

    hashlib 模块

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 md5,sha1,sha224,sha256,sha384,sha512 算法

    创建一个加密函数对象

    >>> import tab   #(这种加密方式将废弃)
    >>> import md5
    >>> hash = md5.new()
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    432a44ddc0aa72ed8c200f53b6268af4
    >>>
    >>> import sha  #(这种加密方式将废弃)
    >>> hash = sha.new()
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    2aa55594b365e70a7ee83d9b5923e493d21ee7ff
    >>>
    
    >>> import hashlib          #(hashlib)
    >>> hash = hashlib.md5()
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    432a44ddc0aa72ed8c200f53b6268af4
    >>>
    >>> hash = hashlib.sha1()   #(sha1)
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    2aa55594b365e70a7ee83d9b5923e493d21ee7ff
    >>>
    >>>
    >>> hash = hashlib.sha256() #(sha256)
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    7d2ad2f73b51c875d301ae7c57f19772d628771b330a67a750701bdedcd37d5e
    >>>
    >>>
    >>> hash = hashlib.sha384() #(sha384)
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    b2637c4901864c63a7eadd0da97ddd19417cd81016cfbf20c4984007de04efe78a6cd9b2855e3fb8f0a88546dfe68e1e
    >>>
    >>>
    >>> hash = hashlib.sha512() #(sha512)
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    41772713f60dc12dd1d183b865c41e914b8ef56d7509b7ae657ad9f7a4be283172e79b71ef42474c4f4aa2b7c3a120e6bf719022d1a647fcbe2e7b3f64d42ddd
    >>>
    
    
    

    以上加密算法其实但还存在缺陷,别人通过撞库可以反解,因此有必要对加密算法中添加自定义key来加密。
    请看下面两种:

    >>> import hashlib
    >>> hash = hashlib.md5('dkujhn33^57Jlddrrlkg')
    >>> hash.update('allen123')
    >>> print hash.hexdigest()
    62b6828287f647d75432905c89b21305
    

    hmac 模块

    它内部对我们创建key和内容再进行处理然后再加密

    >>> import hmac
    >>> hash = hmac.new("allen123")
    >>> hash.update("^test123yyh123^&")
    >>> print hash.hexdigest()
    6aa286ef24c63e6072b3904802aa795a
    
  • 相关阅读:
    C语言volatile关键字的用法
    UDP广播包
    进程和线程的区别
    Unix/Linux进程间通信
    虚拟空间,malloc
    自我介绍
    java初始化顺序
    java 队列基础操作
    java IO基础操作
    Python中的Tab补全功能添加
  • 原文地址:https://www.cnblogs.com/yangyinghua/p/4996403.html
Copyright © 2020-2023  润新知