模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test)
Import module_name
Import module_name1, module_name2
From module_alex import * 表示导入模块module_alex中的所有(不建议使用)
From module_alex import * 是导入module_alex中所有的代码
From module_alex import logger as logger_alex 这种方法可以解决两个程序名一致的问题
就module_alex = all code 即将module_alex中的代码解释一遍,并赋给module_alex
Import module_name —module_name.py— module_name.py路径-sys.path中
用来从逻辑上组织模块的,本质就是一个目录,(必须带有一个__init__.py的文件)
导入包的本质就是执行包里面的__init__.py文件
所以不能import pack_age 直接导入包,但是可以在__init__.py中导入对应的模块,然后import pack_age,这样就可以用了。
二者导入都是可以的
From module_test import test 可以优化,相当于直接在该文件中把导入的代码粘贴过来,
Import module_test
module_ test . test () 在调用的时候 先找module_test,然后再找对应的test()方法,当导入多个的时候,此方法会增大代码的耗时。
a、标准库
b、开源模块
c、自定义模块
标准模块:
通用的几种时间表示方式:格式化的时间、时间戳(timestamp)、元组(struct_time)时间表示
UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8(即中国比标准时间多8个小时)。DST(Daylight Saving Time)即夏令时。
1)time.time() 获取时间戳
2)time.sleep(n) 睡n秒
3)time.gmtime(时间戳) 可以把时间戳转换为元组时间表示,若是不传入参数,则转换为标准时间(UTC )time.localtime()即当地的时间=UTC+8
4)time.localtime( ) 即当地的时间 = UTC+8
X= time.localtime( ) X.tm_year 获得年份
可以传入时间戳 转化为元组时间
5)time.mktime()可以将元组时间转化为时间戳模式,传入的参数是元组时间
6)time.strftime(参数) 输出:格式化的时间,将元组时间转换为格式化时间
参数:(format,x)format是转化时间的格式,例如”%Y-%m-%d”,x是元组的时间。
7)time.strptime(参数)
参数:(string ,format)即将格式化的时间转化为元组时间
String 是时间, format 是string时间的格式,二者必须是一一对应关系
8)time.asctime( ) 参数为元组。将元组时间转化为格式时间(和format格式不一样)
9)time.ctime() 参数为时间戳,将时间戳时间转化为格式时间(和format格式不一样)
10)datetime 模块
获取当前时间 datetime.datetime.now()
datetime.datetime.now()+datetime.timedelta(3) 获得当前时间三天后的时间
datetime.datetime.now()+datetime.timedelta(hours=3) 获得当前时间3小时后的时间
1)Random.random() 生成一个0到1的小数([0,1]包括0 但是不包括1)
2)random.randint(1,3) 生成一个1到3的整数([1,3]两边都包括)
3)random.choice(参数) 参数可以是字符串、字典、元组 、序列
4)random.uniform(a,b)随机生成a到b的小数,包括a不包括b
5)random.shuffle(参数) 洗牌功能
参数若是列表,则可以打乱列表中的顺序。
6)random.sample(参数,n)
可以随机取出n个参数里面的数据
7)实现验证码功能:
import random
checkcode = ''
for i in range(4):
current = random.randint(0,3)
if current == i:
tmp = chr(random.randint(65,90))
else:
tmp = random.randint(0,9)
checkcode+= str(tmp)
print(checkcode)
提供对操作系统进行调用的接口
1)os.getcwd()获得当前工作目录
2)os.chdir( “c:\users”)切换工作目录
os.chdir( r“c:\users”) 两种方式,推荐这种方式
3)os.makedirs(path ) 递归的创建目录
4)os.removedies(path) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依次类推。
5)os.mkdir(path) 不能完成递归建文件件
6)os.rmdir(path) 删除文件夹 不递归删除
7)os.listdir(path)返回路径中的文件件(以列表的形式)
8)os.rename(“oldname”,”newname”)重命名文件/目录
9)os.stat(path) 获取文件/目录信息
10)os.sep 输出操作系统特定的路径分隔符,win下为“\”, Linux下为“/”
11)os.linesep 输出当前平台使用的行终止符,win下为“\t\n”,linux下为“\n”
12)os.pathsep 输出用于分割文件路径的字符串(win 下为“;”,linux下为“:”)
13)os.environ 获得系统的环境变量
14)os.name 输出字符串指示当前使用平台,win是“nt”
15)os.system(“bash command”)运行shell 命令
16)os.path.abspath(path 获得路径的规范化的绝对路径
17)os.path.split(path) 返回路径分割成目录和文件名二元组
18)os.path.dirname(path) 返回path的目录,其实就是os.path.split(path)的第一个元素。
19)os.basename(path) 返回最后的文件名,如果path是以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
20)os.path.exists(path) 如果path存在,返回True,如果path不存在,则返回False
21)os.path.isabs(path) 如果path是绝对路径,则返回True,否则,返回False(win下有多个根路径,即每个盘就一个根路径,Linux只有以/开头的才是根路径,即是绝对路径)
22)os.path.isfile(path) 如果path是一个存在的文件,则返回True,否则为False
23)os.path.isdir(path) 如果path是一个存在的目录,则返回True,否则为False
24)os.path.join(path1[,path2[,…]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
25)os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
26)os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
1)sys.argv 命令行参数list,第一个元素是程序本身路径
2)sys.exit(n) 退出程序,正常退出时exit(0)
3)sys.version 获取python解释程序的版本信息
4)sys,maxint 最大的int值
5)sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6)sys.stdout.write(‘please:)
Val = sys.stdin.readline()[:-1]
高级的文件、文件夹、压缩包
Shutil 对压缩包处理是调用ZipFile 和TarFile两个模块来进行的。
Xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没有诞生的黑暗年代,大家只能选择用xml,至今很多传统公司如金融行业的很多系统的接口还主要是xml
Xml格式如下:就是通过<>来区别数据结构的:
<data>
<country name="Liechtenstein">
<rank updated="yes">2rank>
<year>2008year>
<gdppc>141100gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
country>
<country name="Singapore">
<rank updated="yes">5rank>
<year>2011year>
<gdppc>59900gdppc>
<neighbor name="Malaysia" direction="N"/>
country>
<country name="Panama">
<rank updated="yes">69rank>
<year>2011year>
<gdppc>13600gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
country>
data>
Xml协议在各个语言里的都是支持的,在python中可以用以下模块操作xml
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
#遍历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)
用于生成和修改常见配置文档,当前模块的名称在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生成一个这样的文档?
import 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)
结果:
[DEFAULT]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes
[bitbucket.org]
user = hg
[topsecret.server.com]
host port = 50022
forwardx11 = no
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供SHA1 SHA224 SHA256 SHA384 SHA512 ,md5算法
import hashlib
m2 = hashlib.sha256()
m2.update(b"sdfad")
print(m2.hexdigest()) #16进制表示
1)’.’ 默认匹配除\n(换行)之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行。
2)’^’匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r”^a”,”\nabc\neee”,flags = re. MULTILINE)
3)“美元符号 ”匹配字符结尾,或e.search(“foo$”,”bfoo\nsdfsf”,flags = re.MULTILINE).group( )也可以
4)‘’匹配号前的字符0次或多次,re.findall(”ab*”,”cabb3abcbbac”)结果为[‘abb’,’ab’,’a’]
5)’+’匹配前一个字符1次或多次,re.findall(“ab+”,”ab+cd+abb+baa”)结果为[‘ab’,’abb’]
6)‘?’匹配前一个字符1次或0次
7)’{m}’匹配前一个字符m次
8)’{n,m}’匹配前一个字符n到m次,re.findall(“ab{1,3}”,”abb abc abbcbbb”)结果 [‘abb’,’ab’,’abb’]
9)‘|’匹配|左或|右的字符,re.search(“abc|ABC”,”ABCBabcCD”).group() 结果‘ABC’
10)‘(…)’分组匹配,re.search(“(abc){2}a(123|456)c”,”abcabca456c”).group() 结果”abcabca456c”
11)’\A’只从字符开头匹配,re.search(“\Aabc”,”alexabc”)是匹配不到的
12)’\z’匹配字符串结尾,同$
13)’\d’匹配数字0-9
14)’\D’匹配非数字
15)’\w’匹配[A-Za-z0-9](除特殊字符)
16)’\W’匹配非[A-Za-z0-9](特殊字符)
17)’\s’匹配空白字符、\t、\n、\r,re.search(“\s+”,”ab\tc1\n3”).group() 结果’\t’
18)’(?P…)’分组匹配 re.search(“(?P[0-9]{4})(?P[0-9]{2}) (?P[0-9]{4})”,” 371481199306143242").groupdict(“city”) 结果{‘province’: ‘3714’, ‘city’: ‘81’, ‘birthday’: ‘1993’}
1)re.match 从头开始匹配
2)re.search 匹配包含
3)re.findall 把所有匹配到的字符放到以列表中的元素返回
4)re.splitall 以匹配到的字符当做列表分隔符
5)re.sub 匹配字符并替换
R[a-z]匹配R和小写字母
R[a-ZA-Z]+匹配R和多个小写字母或多个大写字母
“#.+#”匹配#号和中间即以#结尾的
遇到特殊的要用反斜杠’\’转译
Split 分割
Sub替换
反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"“作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\“表示。同样,匹配一个数字的”\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
仅需轻轻知道的几个匹配模式
re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变’^‘和’$‘的行为(参见上图)
S(DOTALL): 点任意匹配模式,改变’.'的行为
作业
开发一个简单的python计算器