一、概念
模块
1、三种类型:
(1)python标准库
(2)第三方模块
(3)自定义模块
2、导入
(1)import:
1)执行;2)调用
(2)from __ import * (不推荐)
(3)执行对应文件
__init__.py
包
调用要到模块,才能用
(1)__name__:名称,路径
(2)if __name = "__main__": :执行函数
二、模块
1、time
(1)时间戳(1970年1月1日凌晨开始)
# 时间戳 #计算
print(time.time()) #1481321748.481654秒
(2)结构化时间
# 结构化时间---当地时间
print(time.localtime(1531242343))
t=time.localtime()
print(t.tm_year)
print(t.tm_wday)
# -----#结构化时间---UTC
print(time.gmtime())
(3)将结构化时间转换成时间戳
# -----将结构化时间转换成时间戳
print(time.mktime(time.localtime()))
# ------将结构化时间转成字符串时间strftime
print(time.strftime("%Y---%m-%d %X",time.localtime()))
# ------将字符串时间转成结构化时间strptime
print(time.strptime("2016:12:24:17:50:36","%Y:%m:%d:%X"))
print(time.asctime()) # 结构化时间转换
print(time.ctime()) # 时间戳转换
#比较实用
import datetime
print(datetime.datetime.now())
2、random
(1)功能
import random
ret=random.random() # 0-1的随机数
ret=random.randint(1,3) # 1-3之间的整数
ret=random.randrange(1,3) # 1,2
ret=random.choice([11,22,33,44,55]) # 随机选一个
ret=random.sample([11,22,33,44,55],2) # 随机选两个
ret=random.uniform(1,4) # 随机浮点型
print(ret)
ret=[1,2,3,4,5]
random.shuffle(ret) #打乱顺序
print(ret)
(2)验证码
def v_code():
ret=""
for i in range(5):
num=random.randint(0,9)
alf=chr(random.randint(65,122))
s=str(random.choice([num,alf]))
ret+=s
return ret
print(v_code())
3、os模块
(1)功能
os.getcwd() # 当前工作路径
os.chdir("..") # 改变当前工作目录(..返回上一层)
print(os.getcwd())
os.makedirs('dirname1/dirname2') # 建立文件夹
os.removedirs("dirname1/dirname2") # 删除文件夹(有内容就不删)
print(os.listdir()) # 当前目录列表
print(os.stat("sss.py")) # sss.py的属性信息
print(os.system("dir"))
print(os.path.split(r"C:\Users\Administrator\脱产三期\day22\sss.py"))
print(os.path.dirname(r"C:\Users\Administrator\脱产三期\day22\sss.py"))
print(os.path.basename(r"C:\Users\Administrator\脱产三期\day22\sss.py"))
a="C:\Users\Administrator"
b="脱产三期\day22\sss.py"
os.path.join(a,b)# 路径拼接
#coding=utf-8
import os #导入OS模块
os.getcwd() #得到当前工作目录
os.listdir() #指定所有目录下所有文件和目录
os.remove() #删除目录
os.rmdir() #删除目录
os.mkdir() #创建目录
os.path.isdir() #判断指定对象是否为目录
os.path.isfile() #判断指定对象是否为文件
os.path.exists() #判断指定对象是否存在
os.path.split() #返回路径的目录和文件名
os.chdir() #改变目录到指定目录
os.path.getsize() #获得文件大小,如果为目录,结果为0
os.path.abspath() #获得绝对路径
os.path.join(path,name) #连接目录或文件名
os.path.basename(path) #返回文件名
os.path.dirname(path) #返回文件路径
4、sys
(1)功能
sys.exit() # 退出
sys.version # 获取版本
sys.argv # 命令行参数List,第一个元素是程序本身路径
(2)进度条
import time
for i in range(100):
sys.stdout.write("#")
time.sleep(0.1)
sys.stdout.flush() # 立即显示
5、json
(1)功能
json.dumps() # 将数据类型转换为json数据
dic={'name':'alex'} #---->{"name":"alex"}----->'{"name":"alex"}'
i=8 #---->'8'
s='hello' #---->"hello"------>'"hello"'
l=[11,22] #---->"[11,22]"
json.load() # 加载json数据
(2)示例
# 写文件
dic='{"name":"alex"}'
f=open("hello","w")
f.write(dic)
# 读文件
f_read=open("hello","r")
data=f_read.read()
print(type(data))
data=eval(data)
print(data["name"])
#---------------------------------------------------------------------
# json-双引
import json
dic={'name':'alex'} #---->{"name":"alex"}----->'{"name":"alex"}'
i=8 #---->'8'
s='hello' #---->"hello"------>'"hello"'
l=[11,22] #---->"[11,22]"
f=open("new_hello","w")
dic_str=json.dumps(dic)
f.write(dic_str) #json.dump(dic,f)
# data = json.load(f)
(3)pickle(不可读)与json几乎一样,只是处理为字节-支持的类型更多,一般json
import pickle
f = open('序列化对象_pickle', 'rb')
data = pickle.loads(f.read()) # 等价于data=pickle.load(f)
print(data['age'])
6、shelve(不常用)
# # -------------------------shelve模块---------
import shelve
f = shelve.open(r'shelve1') # 目的:将一个字典放入文本 f={}
#
# f['stu1_info']={'name':'alex','age':'18'}
# f['stu2_info']={'name':'alvin','age':'20'}
# f['school_info']={'website':'oldboyedu.com','city':'beijing'}
# f.close()
print(f.get('stu1_info')['age'])
7、xml-出现晚于json
import xml.etree.ElementTree as ET
tree = ET.parse("xml_lesson")
root = tree.getroot()
print(root.tag)
for i in root:
#print(i.tag)
#print(i.attrib)
for j in i:
#print(j.tag)
#print(j.attrib)
print(j.text)
# 遍历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)
# ---------------------------------------
import xml.etree.ElementTree as ET
tree = ET.parse("xml_lesson")
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("xml_lesson")
# 删除node
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) # 打印生成的格式
8、re(正则表达式)-操作字符串 -模糊匹配
# ---------------------------功能------------------------------
re.findall('a', 'asdasda') # 返回所有满足匹配条件的结果,放在列表里
re.search('a', 'asdasda').group()
re.match('a', 'asdasda').group() # 同search,不过只在字符串开始处匹配
re.split('[ab]', 'absd') # 先按'a'分割得到''和'bsd'分别按'b'分割
# ['', '', 'sd']
re.sub('\d', 'abc', 'alvinSyuan6', 1) # 替换字符 (1次)
re.subn('\d', 'abc', 'alvinSyuan6', 1) # 替换了多少次
com = re.compile("\d+")
com.findall("asdasdwda45472")
元字符 . ^ $ * + ? {} [] () \
(1)通配符 .
# . 通配符-除了换行(/n)其他都可以匹配
re.findall("asda", "asdfefs")
re.findall("a.d", "asdfefs") # 一个.代表一个字符
(2)^ -只能在字符串开头匹配
# 必须放在开头
re.findall("^a..a", "asdaasdasdasdasdweqw")
(3)$ -只能在字符串结尾匹配
# 必须放在结尾
re.findall("^a..a$", "asdaasdasdasdasdweqw")
(4)重复- * + ? {}
# * 0到无穷次(可以没有)-贪婪匹配
re.findall("d*", "asdaasdasdasdasdweqw")
# + 1到无穷次(至少有一个) -贪婪匹配
re.findall("asdx+", "asdefxxxxxx")
# ? 0或1次
re.findall("asdxl?", "asdxxxlxxx")
# {} {0,}==* {1,}==+ {0,1}==? {6}重复6次
re.findall("asdx{6}", "asdxxxlxxx")
#------------------------贪婪转惰性--------------------------
# 后面加个?
re.findall("asdx+?", "asdefxxxxxx") # 惰性匹配,只匹配一次
(5)[] 字符集-只能在字符串结尾匹配
# [] 或;里面没有特殊符号,除了4个- ^ \
re.findall("x[yz*]p", "xypuuuuxzpuuu")
# - 至
re.findall("q[a-z]*", "qweeedfs")
# ^ 非
re.findall("\([^()]*\)", "12+(34*6+2-5*(2-1))")
# (2-1)
# \ 转义符号
# \d 任何十进制数字
# \D 任何非数字字符
# \s 任何空白字符
# \S 任何非空白字符
# \w 任何字母数字和_
# \W 任何非字母数字_
# \b 特殊字符边界,空格,&,#等
(6)r-python这一层不做任何翻译,只取原生字符(补充,不是元字符)
# r
re.findall(r"I\b", "I am")
(7)| -或
re.findall(r"ka|bc", "qweqka|bcasd")
# ['ka', 'bc']
(8)() -分组
# 只找第一个,返回对象
re.search("\d+", "sdasd35asdasda78")
# 取出结果
re.search("\d+", "sdasd35asdasda78").group()
# '35'
# 分组命名
re.search("(?P<name>[a-z]+)\(?P<age>\d+)", "abex36asde34asdasd33").group("age")
9、logging
(1)方法
import logging
#------------------basicConfig-----------------------------
logging.basicConfig(
level = logging.DEBUG, # 日志级别
filename = "logger.log", # 写入文件
filemode = "w", # 默认追加,不追加
# 时间,文件名,行号,信息
format = "%(asctime)s %(filename)s [%(lineno)] %(message)s"
)
logging.debug()
logging.info()
logging.warning()
logging.error()
logging.critical()
#-------------------logger-------------------------------多用
logger = logging.getLogger() # 获取日志
fh = logging.FileHandler("test_log") # 向文件发送日志
ch = logging.StreamHandler() # 向屏幕发送日志
fm = logging.Formatter("%(asctime)s %(message)s")
fh.setFormatter(fm)
ch.setFormatter(fm)
logger.addHandler(fh)
logger.addHandler(ch)
logger.setLevel("DEBUG")
logging.debug("q")
logging.info("q")
logging.warning("q")
logging.error("q")
logging.critical("q")
10、configparser -为了配置文件而开发
11、hashlib -用于加密相关的操作