W5_import_time_random_os_sys_shelve_xml_configparser_hashlib_hmac_re
W5_import_time_random_os_sys_shelve_xml_configparser_hashlib_hmac_re
- 68.第03章节-Python3.5-模块定义、导入、优化详解1
- 69.第04章节-Python3.5-模块定义、导入、优化详解2
- 70.第05章节-Python3.5-内置模块详解之time与datetime模块
- 71.第06章节-Python3.5-内置模块详解之random模块
- 72.第07章节-Python3.5-内置模块详解之OS模块
- 73.第08章节-Python3.5-内置模块详解之Sys模块
- 74.第09章节-Python3.5-内置模块详解之Shelve模块
- 75.76.第10章节-Python3.5-内置模块详解之Xml模块
- 77.第12章节-Python3.5-内置模块详解之Configparser模块
- 78.第13章节-Python3.5-内置模块详解之Hashlib、Hmac模块
- 79.第14章节-Python3.5-正则表达式Re模块使用详解
- W5 practice
68.第03章节-Python3.5-模块定义、导入、优化详解1
1.导入方法:
import moduel_name
import moduel1_name ,moduel2_name
from moduel_name import *
from moduel_name import m1,m2,m3
from module_name import m1 as m1_new_name
2.import本质(路径搜索和搜索路径)
a).导入模块的本质是把模块python文件解释一遍
b).导入包的本质:就是执行该包下的__init__.py文件
import sys,os
print(sys.path)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
#或者使用抛入,让BASE_DIR排到最前面
#sys.path.insert(BASE_DIR)
print(sys.path)
69.第04章节-Python3.5-模块定义、导入、优化详解2
1.导入优化
from module_name import m1
可以避免多次调用模块的某一个功能时:重复检索module_name,重复执行module_name
70.第05章节-Python3.5-内置模块详解之time与datetime模块
时间格式分类:
1,格式化字符
2.时间戳
3.结构化数组
print(help(time))
time.gmtime() #转为struct_time(tumple) ,结果为UTC时区时间
time.localtime() #转为struct_time(tumple) ,结果为本地时区时间
#将时间戳转为字符串格式 # print(time.gmtime(time.time()-86640)) #将utc时间戳转换成struct_time格式 # print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将utc struct_time格式转成指定的字符串格式
时间转换
time.mktime
time.strftime("format_string",struct_tuple)
time.strptime("time","format_string")
time.asctime
time.ctime
referer:http://blog.51cto.com/egon09/1840425
时间加减
import datetime
# print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
#print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19
# print(datetime.datetime.now() )
# print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
# print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
# print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
# print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
#
# c_time = datetime.datetime.now()
# print(c_time.replace(minute=3,hour=2)) #时间替换
71.第06章节-Python3.5-内置模块详解之random模块
random.random()
random.randint(1,3) #包括3
random.randrange(1,3) #不包括3
random.choice("string")
random.choice([1,2,3])
items = [1,2,3,4]
random.shuffle(items)
随机验证码
import random
list_str = []
for i in range(26):
list_str.append(chr(i+ord('a')))
for i in range(10):
list_str.append(str(i))
print("".join(list_str))
print(random.sample("".join(list_str),4))
print(random.sample("abcdefghijklmnopqrstuvwxyz012345678901234567890123456789",4))
72.第07章节-Python3.5-内置模块详解之OS模块
os.getcwd()
os.chdir(r"/to/path") #r'是防止字符转义的
os.curdir
os.pardir
os.makedirs(r'/to/path/a/b/c/d') #递归创建目录
os.removedirs(r'/to/path/a/b/c/d') #递归删除空目录
os.mkdir(r'/path') #创意单级目录
os.rmdir(r'/path') #删除单级空目录
os.listdir(r'/to/path')
os.rename("old_name","new_name") #重命名文件或目录
os.stat()
os.sep #操作系统的路径分隔符
os.linesep
os.pathsep #环境变量中当需要多个路径时,各路径的分隔符
os.name
os.system(cmd) #执行命令,返回0或1
os.environ #获取系统环境变量
os.path.abspath
os.path.split(r'/path/file') #文件名与路径分割,二元组返回
os.path.isfile()
os.path.isdir()
os.path.exists()
os.path.basename()
os.path.join()
os.path.getatime()
os.path.getmtime()
os.stat("filename") #查看文件权限,各种时间等状态信息
返回顶部
73.第08章节-Python3.5-内置模块详解之Sys模块
sys
sys.argv
sys.exit(n)
sys.version
sys.maxint
sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write("please:")
val = sys.stdin.readline()[:-1]
shutil
import shutil
f1 = open("file_1.txt",encoding="utf-8")
f2 = open("file_2.txt","w",encoding="utf-8")
shutil.copyfileobj(f1,f2)
shutil.copyfile("file_a.txt","file_b.txt")
#复制文件内容
shutil.copymode(f_src,f_dst)
#仅拷贝权限
shutil.copy(f_src,f_dst) #拷贝权限,文件
shutil.copy2(f_src,f_dst) #拷贝文件,状态信息
shutil.copytree(src,dst,symlinks=False,ignore=None)
#递归的拷贝文件
shutil.rmtree(path) #递归删除文件
shutil.move(src,dst) #递归的移动文件
shutil.make_archive(base_name,format,path)
#创建压缩包,并返回文件路径
#zipfile压缩
import zipfile
z = zipfile.Zipfile("test.zip","w")
z.write("test_file")
z.close()
#解压
z = zipfile.Zipfile("test.zip","r")
z.extractall()
z.close()
#tarfile压缩
import tarfile
74.第09章节-Python3.5-内置模块详解之Shelve模块
持久化
import shelve
import datetime
name = {
"name":"alex",
"age":22
}
info = ["job","it","test"]
time_value = datetime.datetime.now()
f = shelve.open("test.txt")
f["name"] = name #持久化字典
f["info"] = info #持久化列表
f["time"] = time_value #持久化datetime
f.close()
重新加载回来
import shelve
f = shelve.open("test.txt")
print(f.get("name"))
print(f.get("info"))
print(f.get("time"))
f.close()
75.76.第10章节-Python3.5-内置模块详解之Xml模块
77.第12章节-Python3.5-内置模块详解之Configparser模块
于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser。
来看一个好多软件的常见文档格式如下
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
如果想用python生成一个这样的文档怎么做呢?
mport configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9'}
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
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.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
>>> 'bitbucket.org' in config
True
>>> 'bytebong.com' in config
False
>>> config['bitbucket.org']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.com']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['bitbucket.org']: print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['bitbucket.org']['ForwardX11']
'yes'
configparser增删改查语法
[section1]
k1 = v1
k2:v2
[section2]
k1 = v1
import ConfigParser
config = ConfigParser.ConfigParser()
config.read('i.cfg')
# ########## 读 ##########
#secs = config.sections()
#print secs
#options = config.options('group2')
#print options
#item_list = config.items('group2')
#print item_list
#val = config.get('group1','key')
#val = config.getint('group1','key')
# ########## 改写 ##########
#sec = config.remove_section('group1')
#config.write(open('i.cfg', "w"))
#sec = config.has_section('wupeiqi')
#sec = config.add_section('wupeiqi')
#config.write(open('i.cfg', "w"))
#config.set('group2','k1',11111)
#config.write(open('i.cfg', "w"))
#config.remove_option('group2','age')
#config.write(open('i.cfg', "w"))
78.第13章节-Python3.5-内置模块详解之Hashlib、Hmac模块
Hashlib
import hashlib
m = hashlib.md5()
m.update("test a string".encode(encoding = "utf-8"))
print(m.digest()) #10进制格式
print(m.hexdigest()) #16进制格式,较为常用
m.update("test another string".encode(encoding = "utf-8"))
print(m.hexdigest()) #16进制格式,较为常用
m2 = hashlib.md5()
m2.update("test a stringtest another string".encode(encoding = "utf-8"))
print(m2.hexdigest(),"-->m2:") #16进制格式,较为常用
m3 = hashlib.sha256()
m3.update("test a stringtest another string".encode(encoding = "utf-8"))
print(m3.hexdigest()) #16进制格式,较为常用
加盐
m = hashlib.md5('盐',encodeing='utf-8')
m.update(b"test a string")
print(m.hedigest())
Hmac模块
import hmac
h = hmac.new(b"key123","message aadfjakf".encode(encoding="utf-8"))
print(h.hexdigest())
79.第14章节-Python3.5-正则表达式Re模块使用详解
最常用的匹配语法
re.match 从头开始匹配
re.search 匹配包含,匹配到一个就返回
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换
import re
# re.match((pattern, string, flags=0))
res1 = re.match("^Chen","ChengYiEer")
res2 = re.match("^Chen","CahengYiEer")
res3 = re.match("^Chen\d+","Chen123gYiEer")
print("res1:",res1)
print("res1 match value:",res1.group())
print("res2:",res2)
print("res3 match value:",res3.group())
常用正则表达式符号
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
'\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9],即特殊字符
'\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}
W5 practice
- 实现加减乘除及拓号优先级解析
- 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-25/3 + 7 /399/42998 +10 * 568/14 )) - (-43)/ (16-32) )等类似公式后,必须自己解析里面的(),+,-,,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致