python(10)基础常用模块

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					intfloat
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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值