常用模块

time

1 import time
2 #--------------------------我们先以当前时间为准,让大家快速认识三种形式的时间
3 print(time.time()) # 时间戳:1487130156.419527
4 print(time.strftime("%Y-%m-%d %X")) #格式化的时间字符串:‘2017-02-15 11:40:53’
5
6 print(time.localtime()) #本地时区的struct_time
7 print(time.gmtime()) #UTC时区的struct_time
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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)) #时间替换

OS模块

OS模块
	getcwd()
	chdir 切换
	curdir 返回当前目录   
	pardir
	mkdir 创建文件夹,/最后一个之前均为进入  如果进入失败或创建的文件夹存在会报错
	makedirs  同上 只不过进入失败就会创建
	removedirs(path) / 最后一个文件夹是否为空,为空删 不为空递归上一级查看 直到不为空位置。 一开始查看的最后一个为空则报错
	rmdir('dirname') 文件夹不空,则报错
	remove  强制性删除
	rename 重命名
	stat  获取文件/目录信息
	sep   
		系统文件分隔符
	os.linesep   行终止符
	os.pathsep 默认 可以用ascii查看
	name  win->'nt'; Linux->'posix'
    
	system 脚本命令  
	environ   系统环境变量
	os.path.abspath 返回规范化的绝对路径
	path.split(path)  (“目录前面”,最后一个)
	basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空
	path 是否存在
	isabs  是否为绝对路劲 
	isfile   是否为文件
	isdir  是否为存在的目录
	join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

	os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
	os.path.getsize(path) 返回path的大小
	在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。normcase
		子主题 1
	os.path.normpath('c://windows\\System32\\../Temp/')     规范路径 比如../

sys

 sys.argv           命令行参数List,第一个元素是程序本身路径
 sys.exit(n)        退出程序,正常退出时exit(0)
 sys.version        获取Python解释程序的版本信息
sys.maxint         最大的Int值
 sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
 sys.platform       返

json 和plick

看老林博客

shelve模块

writeback 默认False ,返回的对象为<class ‘shelve.DbfilenameShelf’>一个像字典类型的对象 他是不可变类型
设为True 的话 就为 可变类型
f=shelve.open(r’sheve.txt’)
move(src, dst) 递归的去移动文件,它类似mv命令,其实就是重命名。

shutil模块

shutil.copyfileobj(“可读文件对象”,“可写文件对象” ) # 文件A>B的拷贝
shutil.copyfile(文件名’, 文件名) #目标文件无需存在
copymode 拷贝权限
copy 拷贝文件和权限
copy2(src, dst) 拷贝文件和状态信息
rmtree(‘folder1’) 递归删除

=解 压=
shutil.make_archive(base_name, format,…)
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如 data_bak =>保存至当前路径
如:/tmp/data_bak =>保存至/tmp/
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象

Logging模块

级别

CRITICAL = 50 #FATAL = CRITICAL
ERROR = 40
WARNING = 30 #WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0 #不设置

默认级别为 warning
logging.error(‘错误error’) ERROR:root:错误error

logging.basicConfig(
level(设置界别)=logging.DEBUG,
format="%(sctime)s %(filenames)s "
datefmt(日期)="%a, %d %b %Y %H:%M:%S",
filename="文件路径",
filemode="w")
接下来打印就会往文件里打印 没有filename="文件路径"和filemode="w" 就会往控制台



格式format参数
%(name)s:Logger的名字,并非用户名,详细查看

%(levelno)s:数字形式的日志级别

%(levelname)s:文本形式的日志级别

%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有

%(filename)s:调用日志输出函数的模块的文件名

%(module)s:调用日志输出函数的模块名

%(funcName)s:调用日志输出函数的函数名

%(lineno)d:调用日志输出函数的语句所在的代码行

%(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d:线程ID。可能没有

%(threadName)s:线程名。可能没有

%(process)d:进程ID。可能没有

%(message)s:用户输出的消息

四 logging模块的Formatter,Handler,Logger,Filter对象
#logger:产生日志的对象
#Filter:过滤日志的对象
#Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
#Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式
Handler对象:

FileHandler 最终弄到文件里
logging.FileHandler(‘t1.log’)
logging.StreamHandler()

Formatter日志格式
formmater2=logging.Formatter('%(asctime)s :  %(message)s',  datefmt='%Y-%m-%d %H:%M:%S %p',)

handle控制输出对象.setFormatter(日志格式对象)
logger对象.addHandle(handle控制输出对象)

#loger 的配置文件

import os
import logging.config

# 定义三种日志输出格式 开始

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

# 定义日志输出格式 结束

logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录

logfile_name = 'all2.log'  # log文件名

# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)

# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        '': {   
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },
    },
}

import logging.config
from config.setting import 那个字典
logging.config.dictConfig(LOGGING_DIC) #通过字典配置logging
loger=logging.getLogger(“loger_name”) #去配置文件夹里找logger名得到对象赋值给loge

re模块

# =================================匹配模式=================================
#正则匹配
import re
#\w   大写取反
print(re.findall('\w','hello egon 123')) #['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']
#\s  大写取反  \n \t 都被匹配
print(re.findall('\s','hello  egon  123')) #[' ', ' ', ' ', ' ']

#\d  大写取反  数字
print(re.findall('\d','hello egon 123')) #['1', '2', '3']



#^与$
print(re.findall('^h','hello egon 123')) #['h']
print(re.findall('3$','hello egon 123')) #['3']

# 重复匹配:| . | * | ? | .* | .*? | + | {n,m} |
. 除了\n 任意字符  re.S就可以匹配了
print(re.findall('a.b','a\nb',re.S)) #['a\nb']

#* 0~N   最后一个字符可有可无 没有的话也符合

print(re.findall('ab*','a')) #['a']
print(re.findall('ab*','abbbb')) #['abbbb']

#? 要么一个要么没有 多的话不符合
print(re.findall('ab?','a')) #['a']  
print(re.findall('ab?','abbb')) #['ab']
#匹配所有包含小数在内的数字
print(re.findall('\d+\.?\d*',"asdfasdf123as1.13dfa12adsf1asdf3")) #['123', '1.13', '12', '1', '3']

#.* 取最大长符合的

#.*?为非贪婪匹配:推荐使用
print(re.findall('a.*?b','a1b22222222b')) #['a1b']

#+
print(re.findall('ab+','a')) #[]
print(re.findall('ab+','abbb')) #['abbb']

#{n,m} 贪婪
print(re.findall('ab{2}','abbb')) #['abb']
print(re.findall('ab{2,4}','abbb')) #['abb']
print(re.findall('ab{1,}','abbb')) #'ab{1,}' ===> 'ab+'
print(re.findall('ab{0,}','abbb')) #'ab{0,}' ===> 'ab*'

#[]  
print(re.findall('a[1*-]b','a1b a*b a-b')) #[]内的都为普通字符了,且如果-没有被转意的话,应该放到[]的开头或结尾
print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #[]内的^代表的意思是取反,所以结果为['a=b']
print(re.findall('a[0-9]b','a1b a*b a-b a=b')) #[]内的^代表的意思是取反,所以结果为['a=b']
print(re.findall('a[a-z]b','a1b a*b a-b a=b aeb')) #[]内的^代表的意思是取反,所以结果为['a=b']
print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb')) #[]内的^代表的意思是取反,所以结果为['a=b']

#\# print(re.findall('a\\c','a\c')) #对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
print(re.findall(r'a\\c','a\c')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
print(re.findall('a\\\\c','a\c')) #同上面的意思一样,和上面的结果一样都是['a\\c']

#():分组
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab  输出结果一定为()相符合的内容,()几个就几个
print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>'))#['http://www.baidu.com']
print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">点击</a>'))#['href="http://www.baidu.com"']

#|
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))

() 是把当作一个整体,使输出结果只为括号里内容,(?:)则为 取消
re的其他方法:
search 把第一个符合条件的放进 容器里,下次可以使用group(0)调用出来 没有返回None
match 同 search 但是只看开头 ,如果符合就添加到容器里,下次可以使用group(0)调用出来 没有返回None
split() #[’’, ‘’, ‘cd’],先按’a’分割得到’‘和’bcd’,再对’'和’bcd’分别按’b’分割

sub 替换:
返回值=re.sub(被替换,替换后的字符,目标字符,次数)
subn 会返回一个 (替换后的元组,替换的次数)
还可以使用 \1 做格式化输出
print(’===>’,re.sub(’^(\w+)(.?\s)(\w+)(.?\s)(\w+)(.*?)$’,r’\5\2\3\4\1’,‘alex make love’))
查询到的分组互换位置

命名分组:
re.findall("(?Pimport re)(?Pimport fincd).*(?P=name)",s,re.S) 返回定义了name的列表 [(名字1,名字2)]

print(re.search("(?Pimport re)(?Pimport fincd).*(?P=name)",s,re.S).groupdict()) #返回一个字典{命名分组:命名分组值…命名分组:命名分组}

print(re.findall("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h/1>hello")) group(0)为整体 剩下的为括号里的内容

如果表达式为 ()|… 会先筛选成进列表,但不符合()内容都会变为“”
[]都为普通字符串
正则找到为了找到原义\ 需要3个“\” 或者 4个“\”
.*?为非贪婪匹配

complit(正则表达式) =>将一个正则表达式转换为匹配格式对象
就可以用这个对象 使用正则的一些方法了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值