代码改变世界

5-1模块

2017-12-13 17:52  mmwss  阅读(180)  评论(0编辑  收藏  举报
模块
1,定义
模块:逻辑上组织python代码(变量,函数,类,逻辑:实现功能),.py结尾的python文件
文件名:test.py 模块名:test

2,导入方法
调用 在相同目录下
import 模块名 #import 模块1,模块2,模块3
#当前下有目录 from 目录名 import 模块名
#少用 #from 模块 import * #把模块所有代码导入 函数1,函数2
#用的少 print(模块名.变量名)
模块名.函数名() #调用

from 模块 import 模块下的函数名 as 函数别名(虚数名_模块名) #防止冲突
函数名() #调用

3,import 本质
导入模块把python文件解释一遍 (模块名=模块运行结果)
import 模块名 #运行模块代码 结果给模块名(函数名=函数结果)
from 模块 import 模块下的函数名 #运行一次模块下的函数名

包: 本质是目录(必须带有一个__init__.py文件)
组织模块。 所有模块所在的文件夹
导入包:本质运行一次包下的__init__.py文件
导入的#搜索路径 #import sys #sys.path
附近目录#import os #上级目录ml=os.path.dirname(os.path.dirname(os.path.abspath(__file__))
#写入搜索路径中 sys.path.append(ml)
导入包
import 包名
#__init__ 文件 #import 模块名 #模块名=模块运行结果
导入 from . import test1 #在所有目录下,运行一下test1

4,优化
多次调用模块下的函数名
from 模块名 import 函数名

5,模块的分类
a,标准库
b,开源模块
c,自定义模块

a,标准库
#时间模块 time,datatime
显示时间,日期,时间戳1970年1月1日,秒
import time
time.asctime() #'Tue Dec 12 13:17:02 2017'
时间戳
time.time()#结果是秒。除3600/24/365 时间戳1970-01-01 + 是今年
格式化输出
元组(9个元素)
time.localtime()#本地,年,月,日,时,分,秒,一周第几天,一年中第几天,时区
time.gmtime()#UTC+8时区
显示日期 >>> a=time.localtime() >>> time.strftime('%Y-%m-%d %H:%M:%S',a)
time.sleep(2) #暂停2秒
日期转换秒
time.strptime("2016/05/22","%Y/%m/%d") #转换元组
time.mktime(time.strptime("2017/12/12","%Y/%m/%d")) #日期转换成秒

import datetime
datetime.datetime.now() #当前时间
datetime.datetime.now() + datetime.timedelta(3) #当前时间+3天后的时间 -3
datetime.datetime.now() + datetime.timedelta(hour=3)#当前时间+3小时后的时间
datetime.datetime.now() + datetime.timedelta(minutes=3)#当前时间+3分钟后的时间

+ + + + + + + + + + + + +
#随机模块 random
#取随机数值,洗牌,验证码
import random
random.random() #随机生成0-1之间的随便数
print(random.randint(1,99)) #随机生成1-100的整数(包含1和99)
random.randrange(1,3) #随机生成(1,2)不包含3
random.choice('abcdefg') #随机从()内取值 [1,2] ('abc',2)随机取2位
random.uniform(1,3) #随机取1-3间的浮点数

#洗牌功能
a=[1,2,3,4,5]
random.shuffle(a);print(a)

###验证码
#随便生成4个数字
import random
a=''
for i in range(4):
b=random.randint(1,9)
a+=str(b)
print('验证码:随机生成4个数字: ',a)

#验证码 随机生成4个验证码
import random
a=''
for i in range(4):
b=random.randrange(0,4)
if b == i:
c=random.randint(0,9)
else:
c=chr(random.randint(65,90)) #chr(数字转成数字) 65-90 A-Z
a+=str(c)
print('验证码:随机生成A-Z,0-9之间的数: ',a)

#OS模块 系统模块
#系统的操作命令
os.getcwd() 获取当前工作目录
os.chdir(r"d:\rj\python") 改变当前脚本工作目录; 或 ("D:\\rj")
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('目录1/目录2') 可生成多层递归目录
os.removedirs('空目录/空目录') 若目录为空,则删,并递归到上级目录,如也为空,则删,依此类推
os.mkdir('目录1') 生成单级目录
os.rmdir('空目录') 删除单级空目录
os.listdir('.') 列出指定目录下的所有文件和子目录,包括隐藏文件 ('..')('c:')
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录名或文件名
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") =DOS命令 弹窗显示运行命令("mstsc")远程
os.environ 获取系统环境变量
os.path.abspath(path) 获取绝对路径 ('.')当前
os.path.split(path) 将path分割成目录和文件名二元组返回 (r'c:\rj\python\python.exe')
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何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[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
(r'c:',r'\rj',r'\rj\python') #中间的被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

#sys模块
sys.argv 命令行参数List,第一个元素是程序本身路径 读取参数sys.argv 1 2 3 类似$1 $2
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,环境变量路径
sys.platform 返回操作系统平台名称

#shutil模块
#复制,删除,移动,压,解
#复制 a.txt 复制成 b.txt
import shutil

# def copyfileobj(fsrc,fdst,length=16*1024):
# #(旧文件,新文件,一次复制多少)
# while 1:
# buf = fsrc.read(length)
# if no buf:
# break
# fdst.write(buf)

f1=open('a.txt',encoding='utf-8')
f2=open('b.txt','w',encoding='utf-8')
shutil.copyfileobj(f1,f2)
#复制
shutil.copyfile('文件1','文件2') #文件1 复制成 文件2
shutil.copymode('文件1','文件2') #只拷贝内容,用户,组,权现不变
shutil.copystat('文件1','文件2') #拷贝所有信息
shutil.copytree('源目录','新目录')#拷贝目录加文件
#删除
shutil.rmtree('目录') #删除目录+文件
#移动文件 改名
shutil.move('旧文件', '新文件')
#压缩
shutil.make_archive(a.zip或d:\a.zip,压缩种类('zip'),被压的文件名(完整路径))
import zipfile ; a=zipfile.ZipFile("a.zip",'w')
a.write('被压的文件1');a.write('被压的文件2');a.close
#解压
import zipfile ; b= tarfile.open('a.zip','r'); b.extractall()#可设解压地址;b.close()

#序列化模块json,pickle
json,字符串和python数据类型间进行转换 #数据序列化(把字典转字符串)字典不能直接存文件
#解决不同平台的数据交换
pickle,用于python特有的类型 和 python的数据类型间进行转换
#支持所有的python类型
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load

import pickle
a={'a':1,'b':2}
c=pickle.dumps(a)
print(c)
with open('a.txt','w') as fp:
pickle.dump(a,fp)

import json
c=json.dumps(a)
print(c)

with open('b.txt','w') as fp:
json.dump(a,fp)

#shelve模块
#简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
#写 #会创建3个文件
import shelve
d = shelve.open('shelve_test') #打开一个文件
class Test(object):
def __init__(self,n):
self.n = n
t = {'a':1,'b',2}
t2 = Test(123)
name = ["alex","rain","test"]
d["test"] = name #持久化列表
d["t1"] = t #持久化类
d["t2"] = t2
d.close()
#读
import shelve
d = shelve.open('shelve_test') #打开一个文件
print(d.get('test'))
print(d.get('t'))

#xml模块
xml是实现不同语言或程序之间进行数据交换的协议,现在用的少了。因为复杂
#xml文件 解析成 python
import xml.etree.ElementTree as ET #起个别名ET
tree = ET.parse("xmltest.xml") #要处理的文件名
root = tree.getroot() #root是内存地址
print(root.tag) #显示标签名

#遍历xml文档
for child in root:
print(child.tag, child.attrib)
for i in child:
print(i.tag,i.text)
#只遍历year 节点
for node in root.iter('year'):
print(node.tag,node.text)

#修改和删除xml文档内容
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
#修改
for node in root.iter('year'):
new_year = int(node.text) + 1
node.text = str(new_year)
node.set("updated","yes")
tree.write("xmltest.xml")
#删除
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
#自定义
import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = '33'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'

et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True)

ET.dump(new_xml) #打印生成的格式

#PyYAML 做配置文件的
http://pyyaml.org/wiki/PyYAMLDownload
#configparser模块 用于生成和修改常见配置文档
http://www.cnblogs.com/alex3714/articles/5161349.html
#hashlib模块
用于加密相关的操作,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
---检测网站是否被篡改--- 下载MD5比对

#加密 MD5
import hashlib
m = hashlib.md5()
m.update(b"Hello") #加密Hello
m.update(b"It's me") #加密HelloIt's me
print(m.digest()) #2进制格式hash
m.update(b"It's been a long time since last time we ...")
print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
--- MD5加密 ---
hash = hashlib.md5()
hash.update('admin') #加密码admin
print(hash.hexdigest()) #16进制格式hash

# ######## sha256 ########
hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())

# ######## sha512 ########
hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())

#消息加密码 速度快
import hmac
h = hmac.new(b'nihao','中文'.encode(encoding='utf-8'))
print('16进制的加密',h.hexdigest())

import hashlib
h1 = hashlib.md5()
h1.update('中文'.encode(encoding='utf-8'))
print('16进制的加密2',h1.hexdigest())

#re模块
正则表达式符号 动态模糊匹配 用来匹配字符串 多条件匹配
import re
re.match('a','as') #从首字母开始匹配。匹配第一个,匹配即停止(r'\\','ab\\c)匹配\\
re.search('a','cat') #匹配所有。只匹配第一个,匹配即停止
re.findall('a','abacad')#匹配所有。匹配多个符合条件的
re.split('[0-9]+','12ac99cc') #结果['ac','cc'],按数字分隔成列表
re.sub("[0-9]+",'-','ab11ac') #结果'ab-ac',把数字替换为-

'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
re.search('a.','cat') #匹配a出现1次或0次。
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
re.search('^a','abc') #匹配a开头的字母
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
re.search('t$','cat') #匹配t结尾的字母
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
re.search('ab8','acnihao') #匹配b出现0次或多次的字符
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
re.search('ab+','abbdni') #匹配b出现1次或多次的字符
'?' 匹配前一个字符1次或0次
re.search('ab8','acnihao') #匹配b出现0次或1次的字符
'{m}' 匹配前一个字符m次
re.search('ab{2}','abbnihao') #匹配b出现2次的字符 ('(ab){2}','ababcc')#ab两次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
re.search('(ab){1,3}','ababno') #匹配ab出现1-3次的字符
'|' 匹配|左或|右的字符
re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c

'\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
#匹配 空格,换行,回车,tab键(\t)

'(?P<name>...)' 分组匹配
re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143633").groupdict("city")
结果{'province': '3714', 'city': '81', 'birthday': '1993'}

re.search("(?P<id>[0-9]+)","abc123")
#匹配数字
re.search("(?P<id>[0-9]+)","abc123").group()
#只显示匹配到的数字
re.search("(?P<id>[0-9]+)","abc123").groupdict()
{'id':'123'} #显示字典
re.search("(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)","abc123xyz12").groupdict()
{'id':'123','name':'xyz'} #显示字典
re.search("(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)","abc123xyz12").groupdict(id)
'123' #取id的值

匹配模式
re.I() 用点用 #忽略大小写
re.search('[a-z]+',"abCD",flags=re.I)
M() 用的少 #多行模式 改变 ^和$ 行为
re.search('^a','bd\nac') #不能匹配到a
re.search('^a','bd\nac',flags=re.M) #能匹配到a
S() #点任意匹配模式
re.search('^a','ab\nac',flags=re.S) #多行匹配

'''