一、包和文件夹
包的本质就是一个文件夹,文件夹就是将文件组织起来
包和文件夹的区别就是多了__init__文件,导入包就会执行__init__.py。
二、模块
一个模块就是包含一组功能的.py文件。如a.py 模块名就是a
模块分为三块:1.python标准库2.第三方库3.自定义模块
导入文件
import + 模块名
from a import b
模块导入过程中。1.执行被调用文件 2. 引入变量名
如果被调用文件与执行文件具有相同的变量名或函数,执行文件就会覆盖调用文件
模块不会重复导入,只会在第一次import 的时候导入
脚本和模块:
脚本:一个文件就是整个程序,用来被执行
模块:文件中存放一堆功能,用来被导入
当一个文件当作脚本执行时,__name__ == "__main__"
当一个文件当作模块导入时,__name__就是模块名
解释器的搜索路径,放的是执行文件所在的路径,首先送内建模块中,然后在sys.path中找
绝对导入和相对导入
以执行文件的sys.path为起点开始导入,则为绝对导入
以当前文件夹为起点查找,则为相对导入
三、常用模块的使用
1.time模块
时间主要分为三类 1.时间戳(timestamp)2.结构化时间(struct time)3.字符串时间(format time)
时间戳:从1970年1月1日开始计时,是一个秒数
结构化时间:一个元组(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
1 import time
2 print(time.time()) #时间戳
3 print(time.gmtime(1515116)) #utc结构化时间 #把时间戳转为结构化时间
4 print(time.localtime()) #当地结构化时间 把时间戳转为结构化时间
5 print(time.strftime("%Y-%m-%d %H:%M:%S")) #字符串时间
6 print(time.mktime(time.gmtime())) #把结构化时间转为时间戳
7 print(time.strftime("%Y-%m-%d %X",time.localtime())) #把结构化时间转为字符串时间
8 print(time.strptime("1990-05-02 12:15:32","%Y-%m-%d %X")) #把字符串时间转为结构化时间
9 print(time.ctime(time.time())) #把时间戳转为固定格式的字符串时间
10 print(time.asctime(time.localtime())) #把结构化时间转为字符串时间
2.datetime模块
1 import datetime,time
2 print(datetime.datetime.now())
3 print(datetime.date.fromtimestamp(time.time())) #把时间戳转为固定日期格式
4 print(datetime.datetime.now()+datetime.timedelta(days=3)) #当前日期+3天
5 print(datetime.datetime.now()+datetime.timedelta(hours=-3)) #当前日期-3小时
6 crime= datetime.datetime.now()
7 print(crime.replace(hour=3)) #替换时间
3.random模块
1 import random
2 print(random.random()) #0-1之间的浮点数
3 print(random.randint(2,6))#[2-6]之间的随机整数
4 print(random.randrange(2,6))#[2,6)之间的随机整数
5 print(random.choice([2,6,3])) #[2,6,3]中的随机数
6 print(random.sample([2,6,3,5],2)) #[2,6,3,5]中随机选择2个数
7 l= [1,2,3]
8 random.shuffle(l)#对列表进行随机打乱
9 print(l)
10 print(random.uniform(1,3))#大于1小于3的随机数
11
12 #生成随机验证码
13 import random
14 def get_code(n):
15 codes=""
16 for i in range(n):
17 num = random.randint(0,9)
18 alp = chr(random.randint(65,122))
19 code = random.choice([num,alp])
20 codes+=str(code)
21 return codes
22 codes = get_code(5)
23 print(codes)
View Code
4.os模块
1 import os
2 print(os.getcwd()) #当前目录
3 os.chdir("dirname") #切换目录
4 print(os.getcwd())
5 print(os.curdir) #返回当前目录 (.)
6 print(os.pardir) #返回父集目录(..)
7 os.makedirs("./d1/d2")#生成多级目录
8 os.removedirs("./d1/d2") #删除多级目录,只有目录为空时才能删除
9 os.mkdir("./d1")#生成单级目录
10 os.rmdir("./d1")#目录为空时,删除单级目录
11 print(os.listdir("."))#显示目录下的所有文件
12 os.remove("./d") #删除一个文件
13 os.rmdir("./d")
14 os.rename("./d1","d2") #重命名目录或文件
15 print(os.stat("./test1.py"))#获取文件/目录信息
16 print(os.environ)#系统环境变量
17 print(os.path.abspath("./test1.py"))#绝对路径
18 print(os.path.split("./test1.py")) #对路径进行分割,得到一个元组
19 print(os.path.dirname("./test1.py")) #当前文件目录名
20 print(os.path.dirname("./test1.py"))#当前文件名
21 print(os.path.exists("./test1.py")) #判断是否存在该文件
22 print(os.path.join(".","test2.py")) #文件路径拼接
23 print(os.path.join("d/d2","fd/g"))
24 print(os.path.isabs("./test1.py")) #判断是否绝对路径
25 print(os.path.isdir) #判断是否是一个目录
26 print(os.path.isfile("./test1.py")) #判断是否是一个文件
27 print(os.path.getatime("./test2.py")) #返回文件最后存取时间,是一个时间戳
28 print(os.path.getmtime("./test2.py")) #f返回文件最后修改时间
29 print(os.path.getsize("./test2.py")) #获取文件的大小
View Code
5.sys模块
1 import sys
2 print(sys.path) #系统搜索路径
3 print(sys.version) #python解释器的版本信息
4 print(sys.argv) #命令行信息列表,第一个参数是程序本身路径
6.shutil模块
1 import shutil
2 shutil.copyfileobj(open("d.xml","r"),open("dnew.xml","w")) #将文件内容copy到另一个文件
3 shutil.copyfile("d.xml","d2.xml") #copy文件 ,新文件无需存在
7.zipfile模块
import zipfile
#压缩文件
z = zipfile.ZipFile("new","w")
z.write("dd")
z.close()
#解压文件
z = zipfile.ZipFile("new","r")
z.extractall("new2")
z.close()
8.json&pick模块
序列化:把一个变量从内存中转为可存储或可传输的过程。dump\dumps
反序列化:把可存储和可传输的数据重新读取到内存中. load\loads
在json格式中,字符串单引改双引
1 import json
2 data ={"name":"Ezhizen","age":18}
3 with open("info.txt","w") as f:
4 data = json.dump(data) #序列化
5 # f.write(data)
6 with open("info2.txt","w") as f:
7 json.dump(data,f) #序列化
8
9
10 with open("info.txt","r") as f:
11 data = json.loads(f.read()) #反序列化
12 print(data)
13 with open("info2.txt","r") as f:
14 data = json.load(f) #反序列化
15 print(data)
16 data ={"name":"Ezhizen","age":18}
17 import pickle
18 with open("info3.txt","wb") as f:
19 data = pickle.dumps(data) #序列化
20 f.write(data)
21 with open("info3.txt","wb") as f:
22 pickle.dump(data,f) #序列化
23 with open("info3.txt","rb") as f:
24 data = pickle.loads(f.read()) #反序列化
25 print(data)
26 with open("info3.txt", "rb") as f:
27 data = pickle.load(f) #反序列化
28 print(data
View Code
9.shelve模块
import shelve
f=shelve.open(r'sheve.txt')
# f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
# f['stu2_info']={'name':'gangdan','age':53}
# f['school_info']={'website':'http://www.pypy.org','city':'beijing'}
print(f['stu1_info']['hobby'])
f.close()
View Code
10.xml模块
1 #自己生成文档树
2 import xml.etree.ElementTree as ET
3 new_xml = ET.Element("Info")
4 name = ET.SubElement(new_xml,"name",attrib={"Ezhizen":"Yes"})
5 age = ET.SubElement(name,"age")
6 age.text= "18"
7 name = ET.SubElement(new_xml,"name",attrib={"Echizen":"NO"})
8 age = ET.SubElement(name,"age")
9 age.text ="16"
10 et= ET.ElementTree(new_xml) #生成文档树
11 et.write("info.xml",encoding="utf-8",xml_declaration=True)
View Code
1 import xml.etree.ElementTree as ET
2 tree = ET.parse("old.xml") #得到树对象
3 root = tree.getroot()
4 for country in root:
5 print(country) #得到所有的子对象
6 print(country.tag) #得到所有的子对象标签
7 for i in country:
8 print(i) #得到所有的孙对象
9 print(i.tag,i.attrib,i.text) #得到孙对象的标签、属性、文本
10 #修改和添加
11 for year in root.iter("year"):
12 new_year = int(year.text)+1
13 year.text = new_year
14 year.attrib={"updated","yes"}
15 year.set("d","f")
16 tree.write("文件名")
17 #删除
18 for country in root.findall("country"):
19 rank = country.find("rank")
20 if int(rank)<5:
21 root.remove(country)
22 tree.write("文件名")
View Code
11.configparse 模块
配置文件
1 import configparser,os
2 config = configparser.ConfigParser() #获得config对象
3 config.read("info3.txt") #从文件中读取
4 sections = config.sections() #获得所有的标题
5 # print(sections)
6 options= config.options("section1") #获得section1下所有的键
7 print(options)
8 items = config.items("section1") #获得section1下所有的键值对
9 print(items)
10 value = config.get("section1","k1") #获得section1下看k1对应的value 字符串格式
11 print(value)
12 value2 = config.getint("section1","age") #int格式
13 print(type(value2))
14 config.remove_section("section2") #删除section2标题
15 config.remove_option("section2","k1") #删除section2中的k1
16 print(config.options("section2"))
17 config.add_section("new") #添加一个标题
18 config.set("new","name","Ezhizen") #在new标题下添加内容
19 path2 = os.path.abspath(__file__)
20 config.set("new","path",path2) #添加路径
21 config.write(open("new.txt","w"))
View Code
12.hashlib模块
hash是一种算法,传入内容经过hash处理得到一连串的hash值
1.只要传入的内容一样,hash处理后的值一定一样
2.不能由hash值反解成内容
3.只要hash算法不变,得到hash值的长度是一样的
import hashlib
m = hashlib.md5()
m.update("hello".encode("utf-8"))
print(m.hexdigest())
13logging模块
import logging
logging.basicConfig(level="DEBUG",
filename="log",
filemode="w",
format="%(asctime)s%(message)s")
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
import logging
def get_logger():
logger = logging.Logger("root")
fh = logging.FileHandler("log.txt",mode="w")
sh = logging.StreamHandler()
fm = logging.Formatter("%(asctime)s%(message)s")
fh.setFormatter(fm)
sh.setFormatter(fm)
logger.addHandler(fh)
logger.addHandler(sh)
logger.setLevel(1)
logger.debug("debug message")
logger.info("info message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")
get_logger()
View Code
14re模块
re模块的作用是进行模糊匹配
.匹配任意字符
^以什么开头
$以什么结尾
*(0,)
| 或
[] 匹配多个字符
[-] 表示范围[^]非\转义
\d匹配任意数字
\D匹配任意非数字
\s匹配任意空白字符
\S匹配任意非空白字符
\w匹配任意字母数字
\W匹配任意非字母数字
()分组
1 import re
2 print(re.findall("a.b","alb")) #['alb'] 任意字符
3 print(re.findall("^ab","abc")) #['ab'] 以什么开头
4 print(re.findall("ab$","cab")) #['ab'] 以什么结尾
5 print(re.findall("ab*","abbbbb")) #['abbbbb'] (0,)
6 print(re.findall("ab+","abbbb")) #['abbbb'] (1,)
7 print(re.findall("ab?","a")) #['a'] (0,1)
8 print(re.findall("ab{2}","abbbb")) #['abb']2次
9 print(re.findall("ab{0,1}","abb")) #['ab'] (1,3)次==?
10 print(re.findall("ab{1,3}","abb")) #['abb'] (1,3)==+
11 # {0,} == *
12 print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b'] 贪婪匹配
13 print(re.findall('a.*?b','a1b22222222b')) #['a1b']非贪婪匹配
14 print(re.findall('a[1*-]b','a1b a*b a-b')) #匹配多个字符 ['a1b', 'a*b', 'a-b']
15 print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #^非['a=b']
16 print(re.findall('\w+','hello egon 123')) #\w所有的字母数字['hello', 'egon', '123']
17 print(re.findall('\W','hello egon 123')) #[' ', ' ']#\W 非字母数字
18 print(re.findall('\s+','hello egon 123'))#[' ', ' ']空白字符
19 print(re.findall('\S+','hello egon 123')) #['hello', 'egon', '123']非空白字符
20 print(re.findall('\d+','hello egon 123')) #['123'] 数字
21 print(re.findall('\D+','hello egon 123')) #['hello egon '] 非数字
22 print(re.findall('a\\\\c','a\c')) #['a\\c']使用原生字符串且不转义
23 print(re.findall(r'a\\c','a\c')) #['a\\c']
24 print(re.findall("ab|c","abccc")) #['ab', 'c', 'c', 'c']或
25 print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
26 print(re.findall('(ab)+123','ababab123'))#['ab']匹配到末尾的ab123中的ab但只显示分组内容
27 print(re.findall('(?:ab)+123','ababab123')) #['ababab123']显示匹配到的所有内容
28 print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>'))
29 #['http://www.baidu.com'] 显示分组内容
30 print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">点击</a>'))
31 #['href="http://www.baidu.com"'],显示所有内容
32 # print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
33 print(re.findall('e','alex make love') )#返回所有满足匹配条件的结果,放在列表里
34 print(re.search('e','alex make love').group())
35 #只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
36 print(re.match('e','alex make love')) #只在开头进行匹配None
37 print(re.split('[ab]','abcd')) #['', '', 'cd'] 先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割
38 print('===>',re.sub('a','A','alex make love')) ##===> Alex mAke love,不指定n,默认替换所有
39 print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love 替换第一个
40 # print('===>',re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$',r'\5\2\3\4\1','alex make love'))
41 print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love 替换2个
42 obj=re.compile('\d{2}')
43 print(obj.search('abc123eeee').group()) #12
44 print(obj.findall('abc123eeee')) #['12'],重用了obj
View Code
15、copy模块
1 import copy
2 l = [1,2,[3,4]]
3 l2 = copy.copy(l) #浅copy
4 l2[2][0] = 5
5 print(l) #浅copy,只能copy第一层,改变第二层的值,就会改变原copy对象的值
6 print(l2)
7
8 l3 = copy.deepcopy(l)
9 l3[2][0] = 6
10 print(l2)
11 print(l) #深copy,改变第二层,也不会改变原copy对象的值
View Code