Python开发【第六篇】:模块

模块,用一堆封装好的代码,实现某个功能的代码集合。

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

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

模块分为三种:

  自定义模块

  第三方模块

  内置模块

1.自定义模块:

2.导入模块

python之所以应用越来越广泛,在一定程度上也依赖于为程序员提供了大量的模块可以使用。如果想要使用模块,直接导入就可以了!导入模块有以下几种办法:

import module
from module.xx.xx import xx
from module.xx.xx import xx as rename
from module.xx.xx import *

导入模块其实就是告诉python解释器去解释那个py文件

  导入一个py文件,解释器解释该py文件。

  导入一个包,解释器解释该包下的__init__.py文件【py2.7】

那么问题来了,导入模块就是根据那个路径作为来基准来进行的呢?即:sys.path

import sys
print(sys.path)
#输出的结果是
#['C:\\Users\\demo\\PycharmProjects\\q1\\复习', 'C:\\Users\\demo\\PycharmProjects\\q1', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages']

如果sys.path路径列表没有你想要的路径,可以通过sys.path.append('路径')添加

import sys
import os
project_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ret=sys.path.append(project_path)
print(ret)
print(project_path)
#运行结果:None
# C:\Users\demo\PycharmProjects\q1

模块:内置模块是python自带的功能,在使用内置模块的相应的功能时,需要【先导入】再【使用】

一:sys

用于提供对python解释器相关的操作

#!/usr/bin/env python
# -*- coding:utf-8   -*-
import sys
#命令行参数list,第一个元素是程序本身路径
# print(sys.argv)
# 退出程序,正常退出时exit(0)
# print(sys.exit(2))
# 获取python解释程序的版本信息
print(sys.version)
# 返回模块的搜索路径,初始化时使用pythonpath环境变量的值
print(sys.path)
#
print(sys.maxsize)
#最大的int值
# print(sys.maxint)
#返回操作系统的平台名称
print(sys.platform)
# 输入相关
print(sys.stdin)
# 输出相关
# print(sys.stout)
# 错误相关
print(sys.stderr)
from 复习 import demo5

进度条百分比:

import sys
import time
def view_bar(num, total):
    rate = float(num) / float(total)
    rate_num = int(rate * 100)
    r = '\r%d%%' % (rate_num, )
    sys.stdout.write(r)
    sys.stdout.flush()
if __name__ == '__main__':
    for i in range(0, 100):
        time.sleep(0.1)
        view_bar(i, 100)

二:os

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

完整列表:

os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
os.curdir                   返回当前目录: ('.')
os.pardir                   获取当前目录的父目录字符串名:('..')
os.makedirs('dir1/dir2')    可生成多层递归目录
os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()                 删除一个文件
os.rename("oldname","new")  重命名文件/目录
os.stat('path/filename')    获取文件/目录信息
os.sep                      操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep                  当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
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所指向的文件或者目录的最后修改时间

亲手敲的并且实现的:

import os
#获取当前工作目录,即当python脚本的目录路径
# print(os.getcwd())
# 改变当前脚本工作目录,相当于shell下的cd
# print(os.chdir('../qq'))
# print(os.getcwd())
# print(os.chdir('../pro_0811'))
# print(os.getcwd())

# """
# 运行的结果
# C:\Users\demo\PycharmProjects\q1\复习
# None
# C:\Users\demo\PycharmProjects\q1\qq
# None
# C:\Users\demo\PycharmProjects\q1\pro_0811
# """
#返回当前目录:(".")
print(os.curdir)
#返回上级目录:(".")
print(os.pardir)

# """#可生成多层递归目录
# import time
# print(os.makedirs('dir1/dir2'))
# time.sleep(2)
# 若目录未空则删除,并递归到上一级目录,若也为空,则删除,以此类推
# print(os.removedirs('dir1/dir2'))
# """

# """
#创建文件夹
# os.mkdir('demo1')
#删除文件夹
# os.rmdir('demo1')
# """

#输出当前目录下的文件列表
# print(os.listdir())
#移除某指定文件名
# os.remove('s1.dobi')
#重命名文件
# os.rename("s1.py","s2.py")
#获取文件/目录信息
print(os.stat('./'))

 

三:hashlib

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

import hashlib
#############md5#############
hash=hashlib.md5()
# help(hashlib.update)
hash.update(bytes("admin",encoding="utf-8"))
print(hash.hexdigest())
print(hash.digest())

#############md5#############
hash1=hashlib.md5()
hash1.update(bytes("youadmin",encoding="utf-8"))
print(hash1.hexdigest())
print(hash1.digest())

#############sha1#############
hash2=hashlib.sha1()
hash2.update(bytes("admin",encoding="utf-8"))
print(hash2.hexdigest())
print(hash2.digest())

#############sha1#############
hash3=hashlib.sha1()
hash3.update(bytes("youradmin",encoding="utf-8"))
print(hash3.hexdigest())
print(hash3.digest())

#############sha256#############
hash4=hashlib.sha256()
hash4.update(bytes("admin",encoding="utf-8"))
print(hash4.hexdigest())
print(hash4.digest())

hash5=hashlib.sha256()
hash5.update(bytes("youradmin",encoding="utf-8"))
print(hash5.hexdigest())
print(hash5.digest())

#############sha384#############
hash6=hashlib.sha3_384()
hash6.update(bytes("youradmin",encoding="utf-8"))
print(hash6.hexdigest())
print(hash6.digest())

hash7=hashlib.sha3_384()
hash7.update(bytes("admin",encoding="utf-8"))
print(hash7.hexdigest())
print(hash7.digest())

#############sha512#############
hash8=hashlib.sha3_512()
hash8.update(bytes("admin",encoding="utf-8"))
print(hash8.hexdigest())
print(hash8.digest())

上面的加密虽然算法已经非常厉害了,但是还是存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

运行结果是:

C:\Python36\python.exe C:/Users/demo/PycharmProjects/q1/复习/demo7.py
21232f297a57a5a743894a0e4a801fc3
b'!#/)zW\xa5\xa7C\x89J\x0eJ\x80\x1f\xc3'
2c2171f7cdda5f4be0c075512a81c07a
b',!q\xf7\xcd\xda_K\xe0\xc0uQ*\x81\xc0z'
d033e22ae348aeb5660fc2140aec35850c4da997
b'\xd03\xe2*\xe3H\xae\xb5f\x0f\xc2\x14\n\xec5\x85\x0cM\xa9\x97'
a20d9bed455a369cec9ca2af17794ca019c9776a
b'\xa2\r\x9b\xedEZ6\x9c\xec\x9c\xa2\xaf\x17yL\xa0\x19\xc9wj'
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
b'\x8civ\xe5\xb5A\x04\x15\xbd\xe9\x08\xbdM\xee\x15\xdf\xb1g\xa9\xc8s\xfcK\xb8\xa8\x1fo*\xb4H\xa9\x18'
c734fd7429dd05e50403c08a1fd589f18359a3c55d25dbcfc2349053f12fd8b1
b'\xc74\xfdt)\xdd\x05\xe5\x04\x03\xc0\x8a\x1f\xd5\x89\xf1\x83Y\xa3\xc5]%\xdb\xcf\xc24\x90S\xf1/\xd8\xb1'
7fbd6b70ed2246af37a830eb4c3af765e6a227a45600c1f4bd7ce777fc332a12ab11b4b73c56be281b56c928e9c6faff
b'\x7f\xbdkp\xed"F\xaf7\xa80\xebL:\xf7e\xe6\xa2\'\xa4V\x00\xc1\xf4\xbd|\xe7w\xfc3*\x12\xab\x11\xb4\xb7<V\xbe(\x1bV\xc9(\xe9\xc6\xfa\xff'
9765a57f2010506383de91052915ce8bafbdb39f3e5a8c1a1693a0076365d37abbfd3305881ea3b5fa1426316afd7df3
b'\x97e\xa5\x7f \x10Pc\x83\xde\x91\x05)\x15\xce\x8b\xaf\xbd\xb3\x9f>Z\x8c\x1a\x16\x93\xa0\x07ce\xd3z\xbb\xfd3\x05\x88\x1e\xa3\xb5\xfa\x14&1j\xfd}\xf3'
5a38afb1a18d408e6cd367f9db91e2ab9bce834cdad3da24183cc174956c20ce35dd39c2bd36aae907111ae3d6ada353f7697a5f1a8fc567aae9e4ca41a9d19d
b'Z8\xaf\xb1\xa1\x8d@\x8el\xd3g\xf9\xdb\x91\xe2\xab\x9b\xce\x83L\xda\xd3\xda$\x18<\xc1t\x95l \xce5\xdd9\xc2\xbd6\xaa\xe9\x07\x11\x1a\xe3\xd6\xad\xa3S\xf7iz_\x1a\x8f\xc5g\xaa\xe9\xe4\xcaA\xa9\xd1\x9d'

可以看到,加密是越来越复杂,而且自定义字段,也越来越复杂,这长度也会越来越长!基本这样的直观感受!

python内置还有一个hmac模块,它内部对我们创建key和内容进行进一步的处理,然后加密

import hmac
h=hmac.new(bytes('898989sadadsdas',encoding="utf-8"))
h.update(bytes('admin',encoding="utf-8"))
print(h.hexdigest())
print(h.digest())

#运行结果
"""
C:\Python36\python.exe C:/Users/demo/PycharmProjects/q1/复习/demo8.py
775654c8c29f2fde3b5fd83e3c998fcb
b'wVT\xc8\xc2\x9f/\xde;_\xd8><\x99\x8f\xcb'

"""

 

四:random

import random
print(random.random())
print(random.randint(1,2))
print(random.randrange(1.0,20.0))

"""
运行结果:
0.9885385464501338
1
11
"""

来写一个验证码模块:

#验证码模块
import random
checkcode=" "
for i in range(4):
    current=random.randrange(0,4)
    if current !=i:
        temp=chr(random.randrange(65,90))
    else:
        temp=random.randrange(0,9)
    checkcode+=str(temp)
print(checkcode)

五:re模块

python中的re模块提供了正则表达式相关操作

字符:

.匹配除换行符意外的任意字符

\w匹配字母或数字或下划线或汉字

\s匹配任意的空白符

\d匹配数字

\b匹配字符串的开始或者结束

^匹配字符串的开始

$匹配字符串的结束

 

次数:

* 重复零次或者多次

+重复一次或者更多次

?重复零次或者一次

{n}重复n次

{n,}重复n次或者更多次

{n,m}重复n到m次

 

match函数

import re
text='pythontab'
m=re.match(r"\w+",text)
if m:
    print (m.group(0))
else:
    print ('not match')

r = re.match(r"(\w+)", text)
if r:
    print(m.group(0))
else:
    print("not match")
"""
输出结果:
pythontab
pythontab
"""

search函数

#!/usr/bin/env python
# -*- coding:utf-8   -*-
import re
"""
text="pythontab"
m=re.match(r"\w+",text)
if m:
    print(m.group(0))
else:
    print("not match")
"""
text="pyt2ho23ntab"
m=re.search(r"\d+",text)
if m:
    print(m.group(0))
else:
    print("not match")

"""
运行的结果:
C:\Python36\python.exe C:/Users/demo/PycharmProjects/q1/复习/demo12.py
2
"""

match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none!

Python中正则表达式match()函数

如果不创建pattern对象,我们使用match函数可以直接进行正则表达式的匹配,在我看来这种方式更简洁,不过不适合大型程序的编写,后期维护可能会产生困难,不过编写一些小脚本完全可以胜任。

 

六、序列化

python中用于序列化的俩个模块

json用于【字符串】和【python基本数据类型】间进行转换

pickle用于【python特有的类型】和【python基本数据类型】间进行转换

 

json模块提供了四个功能:dumps,dump,loads,load

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

 

#pickle模块:
data={'k1':123,'k2':"hello"} import pickle p_str= pickle.dumps(data) print(p_str) with open('D:/result.pickle','w') as fp: pickle.dumps(p_str,fp) """ Traceback (most recent call last): #输出效果,不知道为什么报错····我也是一脸误解。这俩留做问题吧!!!! b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x05\x00\x00\x00helloq\x03u.' File "C:/Users/demo/PycharmProjects/q1/复习/demo1_序列化.py", line 10, in <module> pickle.dumps(p_str,fp) TypeError: an integer is required (got type _io.TextIOWrapper) """

 

#json序列化demo
#
!/usr/bin/env python # -*- coding:utf-8 -*- data={'k1':123,'k2':'hello'} import json j_str=json.dumps(data) print(j_str) with open('D:/result.json','w')as fp: json.dump(data,fp) """ 输出的结果为: {"k1": 123, "k2": "hello"} """

 

七:

posted @ 2017-08-31 17:06  不懂python的小黑帽  阅读(282)  评论(0)    收藏  举报