一、模块

1.import模块的实质就是把要导入模块里面的代码,从上到下执行一遍,找模块的顺序是,先从当前目录下找,找不到的话,在环境变量里面找
2.模块标准
A:标准模块:
python自带的,不需要安装的,直接import就能用的
B:自己写的模块:
就是自己写的python
C:第三方模块:
别人已经开发好的模块,需要安装的
a:安装方式第一种:
这是操作系统命令,不是在python命令行执行
pip install **** #这是安装一个模块
pip list 查看自己所安装的模块
pip uninstall *** 卸载模块
pip这个模块在python3里面是python自带的,安装完python就能直接用,但是在python2里面没有这个模块,需要你手动安装才能用
easy_install requests 跟pip差不多 可以直接安装,这个也是傻瓜式的

b:第二种方法,手动安装:
1.先下载安装包,直接百度搜例如:python requests模块
2.解压安装包
3.在解压的目录下执行python setup.py install
3.OS模块
清日志脚本
1.创建一个vi clean_log.py脚本
import os
file_list = os.listdir('.')
for file in file_list:
if 'gz' in file:
os.remove(file)
2.然后在该目录下执行此脚本:python3 clean_log.py
3.如果要定时清理日志的话,把它加入到crontab -e里面定时清理
 #crontab -e
  10(分) 21(时) *** python xxx/clean_log.py#即21:10定时执行clean_log.py日志

import os
#常用的
print(os.getcwd())#取当前工作目录
print(os.chdir(r"/Users/yidao/PycharmProjects/byzywq/day5"))#更改当前目录
print(os.mkdir("test1"))#创建文件夹,只能在当前目录创建
print(os.makedirs(r"day7\test1"))#递归创建文件夹,父目录不存在时创建父目录
# print(os.removedirs(r"test1\test2"))#递归删除空目录
# print(os.rmdir("test1"))#删除指定的文件夹,只能删除空文件夹
print(os.remove(r"E:\byz_code\day4\a.txt"))#删除文件,如果要删除其他文件夹下文件加绝对路径
# os.rename("test","test1")#重命名
# print(os.sep)#当前操作系统的路径分隔符
print(__file__)#代表当前文件
print(os.path.abspath('bb.py'))#获取绝对路径
print(os.path.dirname)#获取父目录
print(os.path.dirname(os.path.dirname(__file__)))#获取父目录
print(os.path.exists("/usr/local"))#目录/文件是否存在,返回true或者false
print(os.path.isfile("bb.py"))#判断是否是一个文件
print(os.path.isdir("/usr/local"))#是否是一个路径
print(os.path.join("root",'hehe','haha','a.log'))
print(os.chmod("/usr/local",7))#给文件/目录加权限,7是最高权限,还有421
  windows下\r\n是换行符,Linux下\n是换行符



不常用的
print(os.curdir)#当前目录
print(os.pardir)#父目录
print(os.listdir('.'))#列出一个目录下的所有文件,.代表当前目录
os.rename("test","test1")#重命名
print(os.stat("len_os.py"))#获取文件信息
print(os.linesep)#当前操作系统的换行符
print(os.pathsep)#当前系统的环境变量中每个路径的分隔符,linux是:,windows是;
print(os.environ)#当前系统的环境变量  
sys.path只是针对python有用的环境变量  
print(os.name)#当前系统名称
print(os.path.split("/usr/hehe/hehe.txt"))#分割路径和文件名print(os.path.basename("/usr/local"))#获取最后一级,如果是文件显示文件名,如果是目录显示目录
 print(os.path.isabs("."))#判断是否是绝对路径
print(os.path.isfile("/usr/local"))#判断是否是一个文件
print(os.path.isdir("/usr/local"))#是否是一个路径
print(os.path.join("/root",'hehe','a.sql'))#拼接成一个路径
print(os.path.getatime("len_os.py"))#输出最近访问时间

4.sys模块
import sys
sys.argv#命令行参数List,第一个元素是程序本身路径
sys.exit(n)#退出程序,正常退出时exit(0)
print(sys.version)#获取Python解释程序的版本信息
sys.maxint#最大的Int值
sys.path#返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
print(sys.platform)#返回操作系统平台名称
sys.stdout.write('please:') # 向屏幕输出一句话
val = sys.stdin.readline()[:-1] # 获取输入的值
if __name__=='__main__':#只有在运行自己这个python文件的时候
#才会执行下面的代码,在别的模块里面导入的时候是不会执行的
print('这是在自己文件里面的时候:',__name__)
sayHi('wmh') # 我自测的时候调用

5.time模块
时间、日期操作
import datetime,time
一种是时间戳、一种是格式化时间、一种是时间元组
常用的:

  print(time.sleep(10))#休息几s

  print(time.strftime("%y-%m-%d %H:%M:%S"))#将时间元组转换成格式化输出的字符串,%y年,%m月,%d日,%H时,%M分,%S秒

  print(datetime.datetime.now()+datetime.timedelta(3))#3天后的时间
  print(datetime.datetime.now()+datetime.timedelta(-3))#3天前的时间

不常用:
print(time.timezone)#和标准时间相差的时间,单位是s
print(int(time.time()))#获取当前时间戳
时间戳的意思就是从unix元年(1970.1.1),到现在的秒数
格式化好的时间 2017.6.18 14:30:30
print(time.gmtime(1497767612))#把时间戳转换成时间元组,如果不传的话,默认取标准时区的时间戳,utc时区
print(time.localtime())#把时间戳转换成时间元组,如果不传的话,默认取当前时区的时间戳,标准时区
print(time.mktime(time.localtime()))#把时间元组转换成时间戳
print(time.strptime("20160204 191919","%Y%m%d %H%M%S"))#将格式化的时间转换成时间元组
print(time.struct_time)#时间元组
print(time.asctime())#时间元组转换成格式化时间
print(time.ctime())#时间戳转换成格式化时间
print(datetime.datetime.now())#当前时间格式化输出


6.打开一个网站
import requests
a、打开博客 requests.get
b、从返回的html里面找到文章的超链接地址 正则表达式匹配
c、打开文章的超链接 requests.get
d、保存到本地 写文件
url = 'http://szz.nnzhp.cn/'
req = requests.get(url)
print(req.text)#获取返回的内容
print(req.encoding)#获取网站的编码

二.软件开发规范

bin里面放入口,core里面放主逻辑,conf写配置文件,data目录放一些数据

'''

def sayHi(name):

  print('Hi~ %s'%name) 

if __name__ =='__main__':#只有在运行自己这个Python文件的时候才会执行这个代码,在别的模块导入的时候是不会执行这个代码

  print('这是在自己文件里面的时候',__name__)

  sayHi('wmd')#自测时调用

'''

'''
http://www.jianshu.com/p/1e402922ee32/ markdown语法看这个
'''
三.正则表达式

1.正则表达式就是用来查找字符串的,他能查找规则比较复杂的字符串
一、re模块
import re
s = 'besttest is is is is good'
A:match方法
print(re.match(r'be',s).group())
a.字符串前面加'r'代表原字符串
b.match方法接收3个参数,第一个是匹配的规则,也就是正则表达式,第二个是要查找的字符串,第三个参数不是必填的,用于控制正则表达式的匹配方式,看下面正则表达式的匹配模式。是从字符串的第一个单词中匹配字符串,如果匹配到返回一个对象,如果匹配不到,则返回None
#>>><_sre.SRE_Match object; span=(0, 4), match='best'>
B:search方法
print(re.search(r'is',s))
search方法的参数和match一样,和match方法不一样的是,match是从字符串里面的第一个单词里面找,而search方法则是从字符串的整个内容里面找,如果找到了就返回第一个,找不到就返回None
>>> <_sre.SRE_Match object; span=(0, 4), match='best'>
C:findall方法
print(re.findall(r'is',s))
findall方法的参数上面的match、search一样,和他们不一样的是,findall会返回所有一个list,把所有匹配到的字符串,放到这个list里面,如果找不到的话,就返回一个空的list
>>> ['best']
D:sub方法
print(re.sub(r'best','Best',s))
#sub方法和字符串的replace方法一样,是用来替换字符串的,把匹配到的值替换成一个新的字符串,接收3个参数,第一个是正则表达式,第二个是要替换成什么,第三个就是要查找的字符串,会返回一个新的字符串,如果匹配不到的话,返回原来的字符串
#>>> Besttest is good
print(re.split('best',s))
#split 方法和字符串的split方法一样,是用来分割字符的,按照匹配到的字符串进行分割,返回的是一个list,如果匹配不到的话,那返回的list中还是原来的字符串
#>>> ['', 'test is good']

二、常用正则表达式符号
1.数量词
s = 'besttest is good'
'*' 匹配*号前的字符0次或多次,只是*前面的一个字符
print(re.findall(r'r*','besttest very good'))
>>> ['be']
'+' 匹配前一个字符1次或多次,只是+前面的一个字符
print(re.findall(r'st+','besttest is best'))
>>> ['stt', 'st', 'st']
'?' 匹配前一个字符1次或0次,只是?前面的一个字符
print(re.findall(r'st?','besttest is best'))
'{m}' 匹配前一个字符m次
print(re.findall(r't{2}er','besttest is best letter'))
>>> ['tt']
'{n,m}' 匹配前一个字符n到m次
print(re.findall(r't{2,3}','besttest is best'))
>>> ['tt', 't', 't'] </strong>
'.'代表任意一个字符

2.一般字符
'.' 默认匹配除\n之外的任意一个字符
print(re.findall(r'b.','besttest is good'))
'[....]',字符集合,
>>> ['be']
>>> ['st', 'st', 's', 'st']
'\' 转译符,前面的* + ?这样的字符都有特殊含义了,如果你想就想找它的话,那就得转译了
意思就是说如果你想让特殊字符失去以前的含义,那么就得给它前面加上\
print(re.findall(r'\?','besttest is best????'))
>>> ['?', '?', '?', '?']
'|' 匹配|左或|右的字符
print(re.findall(r'best|is','besttest is best'))
>>> ['best', 'is', 'best']
'[]' 字符集合,某些字符的集合,匹配的时候是这个集合里面的任意一个就行
print(re.findall(r'be[stacj]','besttest is best bejson'))
>>>['bes', 'bes', 'bej']
在[]里面如果用^的话代表取反,也就是不包括的这些字符串的
print(re.findall(r'be[^stac]','besttest is best bejson'))

3.边界匹配

'^' 匹配以什么字符开头,多行情况下匹配每一行的开头
print(re.findall(r'^b','besttest is good best'))
>>> ['b']
print(re.findall(r'^b','besttest is good\nbest',re.M))#多行模式
>>> ['b','b']
'$' 匹配以什么字符结尾,多行情况下匹配每一行的结尾
print(re.findall(r'jpge$|png$|png$','touxiang.png'))
>>> ['d']
print(re.findall(r'd$','besttest is good\nbest is good',re.M))#多行模式
>>>['d','d']
'\A' 仅以什么字符开头,和^不同的是它不能用多行模式
print(re.findall(r'\Ahttp','http://www.baidu.com is good\nhttp://www.souhu.com'))
>>> ['b']
'\Z' 仅以什么字符结尾,和$不同的是它不能用多行模式
print(re.findall(r'.jpge\Z|.png\Z|.gif\Z','touxiang.png\nqq.gif',re.M))
>>> ['d']
4.预定义字符集合

'\d' 匹配数字0-9,+表示出现1次或多次
print(re.findall(r'\d+','sdf2342312sdfs2342342f'))
>>> ['2342312', '2342342']
'\D' 匹配非数字
print(re.findall(r'\D','sdf2342312sdfs'))
>>>['s', 'd', 'f', 's', 'd', 'f', 's']
'\w' 匹配[A-Za-z0-9],也就是所有的字母和数字和中文
print(re.findall(r'\w+','sdf234%^2312sdfs&你好'))
>>>['sdf234', '2312sdfs', '你好']
'\W' 匹配不是[A-Za-z0-9],也就是不是字母和数字
print(re.findall(r'\W','sdf234%^2312sdfs&你好'))
>>>['%', '^', '&']
'\s' 匹配空白字符、\t、\n、\r,空格
print(re.findall('\s','axss\n\tsdf\t\r\t sds 2323'))
>>> ['\n', '\t', '\t', '\r', '\t', ' ', ' ']
'\S'匹配空白字符,不是\t、\n、\r,空格
print(re.findall('\s','axss\n\tsdf\t\r\t'))
>>>['\n', '\t', '\t', '\r', '\t']
print(re.findall(r'ab[A-e]','abc abd abe abf'))
[A-z]表示所有的大小写字母
[a-z]表示所有的小写字母
[A-Z]表示所有的大些字母
[0-9]表示所有的数字
import string,random
# sub_str = string.ascii_letters+string.digits
# new_str = ''.join(random.sample(sub_str,8))
# print('new_str:',new_str)
# print(re.findall(r'[A-Z]',new_str))
# print(re.findall(r'[a-z]',new_str))
# print(re.findall(r'[0-9]',new_str))
# if re.findall(r'[A-Z]',new_str) and re.findall(r'[a-z]',new_str) and re.findall(r'[0-9]',new_str):
# print(new_str)

#匹配包含大小写字母和数字
sub_str = string.ascii_letters + string.digits
fw = open('passwd','w')
def passwds(num):
count = 0
while count<num:
new_str = ''.join(random.sample(sub_str, 8))
if re.search(r'[A-Z]&', new_str) and \
re.search(r'[a-z]', new_str) and \
re.search(r'[0-9]', new_str):
fw.write(new_str+'\n')
count+=1
passwds(100)
5.分组匹配
'(...)' 分组匹配,把某些规则写成在一个组里,这样就可以直接对这个进行一些匹配了,举个例子的话,如果要匹配ip地址的话
ip地址是类似这样的192.168.5.1,每一位都是1位或者3位的数字然后后面有个点正常写的话,得这么写
print(re.findall(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}',"192.168.1.3"))
>>> ['192.168.1.3']
这样写的话,有点麻烦了,通过上面的我们可以发现规律,除了第一个后面的全都是'.\d{1,3}',写重复的代码就是低级的,这样的话就可以用分组了
就把'.\d{1,3}'当做一个整体,然后让他们出现3次就ok了,可以改成下面这样的
print(re.search(r'\d{1,3}(.\d{1,3}){3}',"192.168.1.3").group())#这个是用search方法的,结果和上面的一样的
>>> 192.168.1.3
print(re.findall(r'\d{1,3}(.\d{1,3}){3}',"192.168.1.3"))#咱们继续用findall方法,发现结果是下面的
>>> ['.3']
为啥会这样呢,用match方法和search方法都是正常的,findall方法这里有个坑,就是如果findall方法里面有分组的话,默认就是分组里面的内容,那结果就只是分组里面的内容
,如果想让结果正确的话就在分组最前面写上'?:',一个问号和一个冒号就好了,启用“不捕捉模式”
print(re.findall(r'\d{1,3}(?:.\d{1,3}){3}',"192.168.1.3"))#这么写结果就对了

findall方法里面有分组的话,默认结果就只是分组里面的内容


import os
# print(os.makedirs(r"day7/test1"))#递归创建文件夹,父目录不存在时创建父目录
print(os.rmdir(r"day7"))

 六、补充知识点

1. __init__.py的作用

 

2.(.*),(.?)贪婪模式,非贪婪模式

3.popen(python调用Linux的方式os.system,os.popen)

4.zip

 

posted on 2017-06-22 17:37  cathy_y  阅读(247)  评论(0编辑  收藏  举报