time\random\os\sys
\json\pickle\xml
\re
\logging
\configparser\hashlib
bin.py #通常作为起始文件
系统只会把正在执行的文件添加到搜索路径
可以通过
sys.path() #查询包含哪些包路径
sys.path.append() #添加的为临时变量
#永久修改是添加系统变量
os.path.dirname(__file__)
#执行文件所在路径,pycharm中适用,终端不可以
os.path.dirname(os.path.dirname(__file__))
#执行文件的上一级路径,pycharm中适用,终端不可以
##########绝对路径,也适合终端
os.path.dirname(os.path.dirname(os.path.abspath((__file__)))
#导入模块的时候,会把模块所在的文件从头到尾执行一遍
import modulename
from modulename import function
from modulename import * #把所有的函数导入,不推荐使用,模块中,函数名前有 _(下划线)的函数不会被导入。
from packgename import modulename #模块在执行文件的下一级目录
from packge1.packge2.packge3 import modulename #多层调用使用“.”连接
from packge1.packge2.packge3.modulename import function
from packge1.packge2 import packge3
#执行packge3的__init__文件
#若__init__中包含:from . import modulename
#则可以用以下方式:
packge3.modulename.function()
###################################
#动态导入模块
#用字符串方式导入模块
1、不完整
module_name = __import__("packge1.modulename")
#__import__从字符串中提取模块
#无论字符串里有多少级(.),返回的都是最高级的那个包
print(module_name) #<module 'package1' (namespace)>
module_name.modulename.func()
2、完整
import importlib #引入模块
module_name = importlib.import_module("packge1.modulename")
print(module_name) #<module 'package1.modulename' from ''>
#此时就是完整导入
module_name.func()
##########################################
模块:
import
1、执行对应文件(会把对应文件全部执行一遍)
2、引入变量名
####################__name__
print(__name__) #在当前执行文件中,输出"__main__"
#在调用文件中,输出,调用路径
if __name__ == "__main__"
#在当前执行文件中,True,执行
#在调用文件中的,False,不执行
一、#################### time
import time
1、时间戳
time.time() #1970年0分0秒到现在的秒数
2、结构化时间
t = time.localtime() #结构化时间
#time.struct_time(tm_year=2021, tm_mon=5, tm_mday=26, tm_hour=13, tm_min=48, tm_sec=29, tm_wday=2, tm_yday=146, tm_isdst=0)
t.tm_year........ #可直接调用结构表里的参数
time.gmtime() #同上,但是是显示的格林尼治时间
3.1、结构化时间转化为时间戳
time.mktime(time.localtime())
3.2、结构化时间转换为字符串时间
time.strftime("%Y-%m-%d %X", time.localtime()) #2021-05-26 14:01:28
3.3、将字符串时间转换为结构化时间
time.strptime("2021:5:26:14:05:36", "%Y:%m:%d:%X")
#time.struct_time(tm_year=2021, tm_mon=5, tm_mday=26, tm_hour=14, tm_min=5, tm_sec=36, tm_wday=2, tm_yday=146, tm_isdst=-1)
4、内置固定格式时间
time.ctime() #Wed May 26 14:10:07 2021
time.asctime() #Wed May 26 14:10:07 2021
5、其他时间模块
import datetime
datetime.datetime.now() #2021-05-26 14:16:49.371969
二、#########################random
import random
random.random() #(0,1)
random.randint(1,6) #[1,6]
random.randrange(1,6) #[1,6)
li = [1,2,4554,4666,757,"ef","fef"]
random.choice(li) #从列表中随机选出一个
random.sample(li, 3) #从列表中随机选出3个
random.uniform(2,4) #指定范围内的浮点数
random.shuffle(li)
print(li) #随机打乱列表
三、#####################os
import os
1、获取目录
os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") #改变当前工作目录,相当于shell里的cd
os.curdir #返回当前目录(“.”)
os.pardir #获取当前目录的父目录字符串名(“..”)
2、新建和删除目录
os.makedirs("dirname1/dirnam1") #可生成多层递归目录
os.removedirs("dirname1/dirnam1") #若目录为空,则删除,并递归到上一层目录,若仍为空,则删除,以此类推
os.mkdir("dirname") #生成单级目录
os.rmdir("dirname") #删除单级目录,若目录不为空则无法删除
3、改名,查看和删除文件
os.listdir(path) #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表的方式打印
os.remove(path) #删除一个文件
os.removedirs(path)
os.rename(old, new) #重命名文件、目录
os.stat(path/filename) #获取文件、目录信息
os.path.getatime(path) #返回path所指向文件或者目录的最后存取时间
os.path.getmtime(path) #返回path所指向文件或目录的最后修改时间
4、查看不同系统下的操作符
os.sep #输出当前系统特定的路径分隔符win "\\", linux "/"
os.linesep #换行符:win "\t\n", linux "\t"
os.pathsep #用于分割文件路径的字符串 win “;”, linux “:”
os.name #返回当前平台的名字。win "nt", linux "posix"
5、执行环境
os.system("bash command") #运行shell命令,直接显示
os.environ #获取系统环境变量
6、文件路径操作
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.pathexists(path) #path存在True,不存在false
os.path.isabs(path) #如果是绝对路径,返回True
os.path.isfile(path) #文件存在True,
os.path.isdir(path) #目录存在True
os.path.normpath() #Python中的方法用于规范化指定的路径。在路径规范化过程中,所有冗余分隔符和up-level引用均折叠。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
os.path.join(path,paths) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略?????
四、######################sys
import sys
sys.argv #命令行参数List,第一个元素是程序本身
sys.exit(n) #退出程序,正常退出是exit(0)
sys.version #获取Python解释程序的版本信息
sys.macint #最大的int值
sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform #返回操作品台的名称
sys.stout.write(xxx) #终端输出,先缓存,等全部结束再显示出来
sys.stout.flush() #将上一个函数缓存的同步显示出来
五、#################json & pickle 、 shelve、xml
序列化和反序列化
1、json
import json
json.dumps(xxx) #将xxx转换为json统一规范下的字符串
json.loads(xxx) #将从文件中读出的字符串xxx,转换为原有的类型
1、转换为json格式接入文件
dic = {'name':'Q'} #' ===>> "
f = open("file", "w")
data = json.dumps(dic)
f.write(data)
上面两步等于:
json.dump(dic,f)
2、将json格式文件读入
f = open("file", "r")
data = json.loads(f.read()) #等价于data = json.load(f)
jison类型 python类型
{} dic
[] list
"string" str
123.45 int或float
true/false True/False
null None
2、pickle
import pickle
pickle.dumps(xxx)
pickle.loads(xxx)
用法和json都一样
json转化为字符串
pickle转化为字节 读写时+b
pickle支持的类型更多
3、shelve
import shelve
4、xml
tag #标签
attrib #属性
text #内容
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
#遍历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)
#修改
for node in root.iter('year"):
new_year = int(node.text) + 1
node.text = str(new_year) #修改text内容
node.set("updated", "yes") #添加属性
node.get("updated") #获取指定属性值
test = ET.SubElement(node, "test", attrib = {"a": "True"}, text = "HH")
node.append(test) #添加元素
#expend insert??????
tree.write("xxxx.xml") #将修改后的内容写入新的xml文件
#删除node
for country in root.findall("country") #找出所有tag为country的
rank = int(country.find("rank").text #找出一个tag为rank的
if rank > 50:
root.remove(country)
tree.write("xxxx.xml")
#写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) # 打印生成的格式
六、##################re
元字符:
. ^ $ * + ? { } [ ] ( ) \
1 . #通配符,一个点代表一个任意字符,不包括换行符
2 ^ #必须放开头,只能在字符串的开头匹配到内容
3 $ #必须放在最后,只能匹配结尾的内容
贪婪匹配:按最多重复个数输出
4 * #重复紧挨着的字符 (0,+00)紧挨着的字符可以不存在
5 + #重复紧挨着的字符 (1,+00)紧挨着的字符至少有一个
6 ? #紧挨着的字符出现0或者1次
7 {} #紧挨着的字符可重复次数的范围
{0,} == *
{1,} == +
{0,1} == ?
{6} == 重复6次
惰性匹配:按最少重复个数输出
范围符后面加?
*?
+?
{}?
8 [] #字符集,里面的字符为或关系,中括号里没有特殊符号,除了 - ^ \
[a-z] #表示a到z的所有字母
[^a-z] #^在字符集里表示 非 ,除了字符集里的都可以匹配
\ #转义字符
[]* #字符集后面跟范围符,只要满足[]里的元素都算重复
9 | #或 符号前后作为整体或
10 () #且 括号内作为一个整体
(?P<label>匹配内容) #固定格式,label给加匹配到的内容标签
11 \ #反斜杠后面跟元字符,去除其功能
#反斜杠后面跟普通字符,实现特殊功能
#(在python中也是转义字符,注意这个坑,如果分不清,请在字符串前加r)
例如:
\d #匹配任何十进制数,它相当于[0-9]
\D #匹配任何非数字字符,它相当于[^0-9]
\s #匹配任何空白字符,它相当于[\t\n\r\f\v]
\S #匹配任何非空白字符,它相当于[^\t\n\r\f\v]
\w #匹配任何字母数字字符,它相当于[a-zA-Z0-9]
\W #匹配任何非字母数字字符,它相当于[^a-zA-Z0-9]
\b #匹配一个特殊字符边界,比如空格, &, #等
re.findall(r"I\b", "hello I am LIST")
re.findall("I\\b", "hello I am LIST")
#匹配出大写的I这个单词
#################
re.match():只在开头开始匹配,匹配不到返回None
re.finditer():匹配所有得到的是一个迭代器,返回迭代器对象(地址)
re.search():从任何位置都可以匹配,匹配到一个
re.findall() #所有的都匹配到,返回列表
re.search() #只返回第一个符合的结果,输出为 位置+匹配结果
re.search().group() #取出结果
#group(label1) == group(0),group(label2) == group(1),......,默认是0
re.search().span() #位置,同上
re.search().start() #起始位置,同上
re.search().end() #结束为止。同上
固定格式:
(?p<label> ) #label给加匹配到的内容标签
(str1|str2) #返回str1或str2而不返回其前后的内容
(?:str1|str2) #返回整串字符
print(re.findall("www\.(baidu|163)\.com", "dsffwrwww.baidu.comfefef")) #['baidu']
print(re.findall("www\.(?:baidu|163)\.com", "dsffwrwww.baidu.comfefef")) #['www.baidu.com']
print(re.search("?P<name>[a-z]+", "131323qiu8688").group("name")) #按标签取出值
print(re.findall("(abc)+", "abcabcabc")) #['abc']
print(re.findall("(?:abc)+", "abcabcabc")) #['abcabcabc']
print(re.findall("abc+", "abcabcabc")) #['abc','abc','abc']
###########################
re.split() #按匹配到的取分割字符串
print(re.split("[ab]", "abc"))
#['', '', 'c']
#注意这个坑,依次分割,左边为空,就返回空
re.sub("匹配内容", "替换内容", "被匹配字符串",num) #num可指定替换的个数,默认全部,返回替换后的字符串
re.subn("匹配内容", "替换内容", "被匹配字符串") #num可指定替换的个数,默认全部,返回(替换后的字符串,替换次数)
com = re.compile(匹配规则) #编译规则
com.findall(字符串)
re.finditer():#匹配所有得到的是一个迭代器,返回迭代器对象(地址)
res = re.finditer()
next(res).group() #
七######################logging
#日志输出
#默认情况下,只显示大于等于warning级别的日志
import logging
#灵活配置,但是存入文件和屏幕显示只能选一个
logging.basicConfig( #基本配置
level = logging.DEBUG, #更改日志输出等级,默认为warning
filename = "logging.log", #设置log存储路径,默认直接stream,设置后,不会stream,直接输出到文件
filemode = "w" #设置文件写入模式,默认追加写入
format = "%(asctime)s\
%(filename)s\
%(lineno)d\
%(levelname)s\
%(message)s" #时间、文件名、行号、日志等级、日志信息
)
logging.debug("debug.message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
format的格式很多
%(asctime)s #时间,2021-05-28 16:06:36,666 逗号后面是毫秒
%(created)f #当前时间,用UNIX标准的表示时间的浮点数表示
%(relativeCreated)d #输出日志信息时的,自logger创建以来的毫秒数
%(thread)d #线程ID.可能没有
%(threadName)s #线程名称。可能没有
%(process)d #进程ID.可能没有
%(name)s #logger的名字,(存在疑问root?)
%(levelno)s #数字形式的日志级别
%(levelname)s #文本形式的日志级别
%(lineno)d #代码所在行号
%(funcName)s #调用日志输出函数的函数名
%(module)s #调用日志输出函数的模块名
%(filename)s #文件名
%(pathname)s #调用日志输出函数的模块的完整路径名,可能没有
%(message)s #输出信息
########
#文件存储和屏幕输出兼得
def logger():
logger = logging.getLogger() #创建log对象,默认root对象,可在括号里创建或指定子对象,同名子对象是同一个对象。子对象输出时,会连带把父对象的内容输出?
fh = logging.FileHandler("filename", "w")#文件输出,模式可选,默认追加
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") #设置输出等级
return logger #返回log对象
logger = logger() #用函数封装,方便调用
logger.debug("debug")
logger.info("info")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
八########################configparser
#写配置文件
import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
"Compression": "yes",
"CompressionLevel": "9"} #default
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'Q'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022' # mutates the parser
topsecret['ForwardX11'] = 'no' # same here
config['DEFAULT']['ForwardX11'] = 'yes'
with open('example.ini', 'w') as configfile:
config.write(configfile)
#####################################
#增删改查
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
config.sections()
#['bitbucket.org', 'topsecret.server.com']
config['bitbucket.org']['User']
#Q
for key in config['bitbucket.org']:
print(key)
config.options('bitbucket.org')
#['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11']
config.items('bitbucket.org')
#[('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')]
config.get('bitbucket.org','compression')
#yes
config.add_section(xxxx)
config.remove_section(xxxx)
config.remove_option(sectionname,key)
config.set(sectionname,key,value)
config.write(open('i.cfg','w'))
九###################hashlib
加密算法
#用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib
m = hashlib.md5() # m = hashlib.sha256()
#不加key,容易被撞库破解
m.hashlib.md5('keyQHH'.encode('utf-8') #添加自定义的key再加密
m.update('secret'.encode('utf-8'))
print(m.hexdigest()) #输出加密结果
#dc5dd693f81b5888e8f0b00e6a1effce
特别注意:
import hashlib
m = hashlib.md5() # m = hashlib.sha256()
#不加key,容易被撞库破解
m.hashlib.md5('keyQHH'.encode('utf-8') #添加自定义的key再加密
m.update('secret'.encode('utf-8'))
m.update("qq".encode('utf-8'))
#####
m.update("secretqq".encode('utf-8'))
#上面行就等于这一行
#######
print(m.hexdigest()) #输出加密结果
[参考](https://www.cnblogs.com/yuanchenqi/arcticles/5732581.html)