my python day5
一、包和文件夹
包的本质就是一个文件夹,文件夹就是将文件组织起来
包和文件夹的区别就是多了__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)
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")) #获取文件的大小
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
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()
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)
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("文件名")
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"))
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()
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
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对象的值