一、python学习之模块:
1.模块的本质:
模块的本质就是用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能).py结尾的python文件
2.模块的使用方法:
import +文件名 如:import test1 (文件名一定不要加.py)
导入多个文件则为 import+文件名,文件名 如import test1,test2
from test1 import * 将test1模块的东西全部导入过来并执行一遍 (建议不要使用)
from test1 import m1,m2,m3 将test1模块中的m1,m2,m3分别导入
from test import logger as logger_alex 导入的模块名与当前的函数名相同,则可用as对导入的模块名重命名
3.导入的本质:
导入模块的本质就是把python文件解释一遍;
导入包的本质就是执行该包下的__init__.py文件;
4. 模块分类:
自定义模块
内置标准模块(标准库)
开源模块
4-1自定义模块
4-1-a.当前文件的绝对路径:
import os#导入os模块
dir = os.path.abspath(__file__)
print(dir)
4-1-b.当前文件的父级目录绝对路径:
import os#导入os模块
dir = os.path.dirname(os.path.abspath(__file__))
print(dir)
4-1-c.当前文件的父级目录的父级目录绝对路径:
import os #导入os模块
dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(dir)
4-1-d.如果模块和自己写的程序不在同一个目录下,则可以通过sys.path.append(路径)把模块的路径添加到程序中。
import os,sys
dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取python目录的绝对路径
sys.path.append(dir)#讲python目录的路径添加到程序中
#-----想要快速找到该路径,则可使用insert将要添加的目录路径插入到path前面
# sys.path.insert(dir)
import old from read_new #导入read_new.py文件
#在当前路径下调用read_new.py里的某个函数,如user()
read_new.user()
4-2 内置标准模块
4-2-1 time&detetime
时间相关的操作,时间有三种表示方式:
时间戳 1970年1月1日之后的秒,即:time.time()
格式化的字符串 2016-8-23 11:11, 即:time.strftime(‘%Y-%m-%d‘)
结构化时间 元组包含了:年、日、星期等.time.struct_time 即:time.localtime()
学习要点:
获取当前系统时间
print
(time.ctime())
## 将字符串转换成日期格式
str_to_date
=
datetime.datetime.strptime(
"2016-02-01"
,
"%Y-%m-%d"
)
print
(str_to_date)
# 输出=>2016-02-01 00:00:00
## 比现在快5天,(如果是慢5天用减号)
new_date
=
datetime.datetime.now()
+
datetime.timedelta(days
=
5
)
print
(new_date)
## 比现在快5小时(hours)
new_date
=
datetime.datetime.now()
+
datetime.timedelta(hours
=
10
)
print
(new_date)
## 比现在快100秒(seconds)
new_date
=
datetime.datetime.now()
+
datetime.timedelta(seconds
=
120
)
print
(new_date)
4-2-2 random---生成随机数
import random
checkcode = ‘‘
for i in range(4):
current = random.randrange(0,4)
if current != i:
temp = chr(random.randint(10,100))
else:
temp = random.randint(0,9)
checkcode += str(temp)
print (checkcode)
4-2-3 os模块
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: (‘.‘)
os.pardir 获取当前目录的父目录字符串名:(‘..‘)
os.makedirs(‘dirname1/dirname2‘) 可生成多层递归目录
os.removedirs(‘dirname1‘) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(‘dirname‘) 生成单级目录;相当于shell中mkdir dirname
os.rmdir(‘dirname‘) 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir(‘dirname‘) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat(‘path/filename‘) 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win->‘nt‘; Linux->‘posix‘
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
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.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
4-2-4 sys模块
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write(‘please:‘)
val = sys.stdin.readline()[:-1]
4-2-5 shutil模块----高级的 文件、文件夹、压缩包 处理模块
--1--shutil.copyfileobj(fsrc, fdst[, length])----
将文件内容拷贝到另一个文件中,可以部分内容
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)
--2--shutil.copyfile(src, dst)----
拷贝文件:shutil.copyfile(src="D:\WorkSpace\day6\\test1.txt",dst="D:\WorkSpace\day6\\test2.txt")
--3-- shutil.copystat(src, dst)----
拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copystat(src=,dst=)
--4--shutil.copy(src, dst)-----
拷贝文件和权限
shutil.copy(src, dst)
--5--shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)-----
递归的去拷贝文件
--6--shutil.rmtree(path[, ignore_errors[, onerror]])----
递归的去删除文件
--7--shutil.move(src, dst)----
递归的去移动文件
--8--shutil.make_archive(base_name, format,...)----
创建压缩包并返回文件路径,例如:zip、tar
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如:www =>保存至当前路径
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象
--9--shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的----
import zipfile
# 压缩
z = zipfile.ZipFile(‘test.zip‘, ‘w‘)
z.write(‘a.log‘)
z.write(‘data.data‘)
z.close()
# 解压
z = zipfile.ZipFile(‘laxi.zip‘, ‘r‘)
z.extractall()
z.close()
import tarfile
# 压缩
tar = tarfile.open(‘your.tar‘,‘w‘)
tar.add(‘WorkSpace/day5/test.zip‘, arcname=‘test.zip‘)
tar.add(‘WorkSpace/day5/test1.zip‘, arcname=‘test1.zip‘)
tar.close()
# 解压
tar = tarfile.open(‘your.tar‘,‘r‘)
tar.extractall() # 可设置解压地址
tar.close()
4-2-6 shelve模块
这个模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。
import shelve
d = shelve.open(‘shelve_test‘) #打开一个文件
class Test(object):
def __init__(self,n):
self.n = n
t = Test(123)
t2 = Test(123334)
name = ["alex","rain","test"]
d["test"] = name #持久化列表
d["t1"] = t #持久化类
d["t2"] = t2
d.close()
4-2-7 xml
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多
xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml
import xml.etree.ElementTree as ET
# 解析xml文件
tree = ET.parse("test.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 i in root.iter("year"):
print(i.tag, i.text)
# 修改和删除xml文件
tree = ET.parse("test2.xml")
root = tree.getroot()
二、 python学习之正则:
‘.‘ 默认匹配除\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‘}