Python Day5
1、什么是模块
最常见的场景,一个模块就是包含了一组功能的python文件,例如module.py,模块名是module
可以使用import module,四个通用类别:
1 使用Python编写的.py文件
2 已被编译为共享库或DLL的C或c++扩展
3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
4 使用C编写并链接到python解释器的内置模块
2、为什么要用模块
1、从文件级别组织程序,更方便管理
2、拿来主义,提升开发效率
1、第一次导入模块,会发生3件事,重复导入只会引用之前加载好的结果
1.产生一个新的名称空间
2.运行spam.py代码,产生的名字都存放于1的名称空间中,运行过程中global关键字指向的就是该名称空间
3.在当前名称空间拿到一个名字spam,该名字指向1的名称空间
引用spam.py中名字的方式:spam.名字
强调:被导入的模块在执行过程中使用自己独立的名称空间作为全局名称空间
2、起别名:import spam as sm
3、一行导入多个模块:import time,sys,spam
优点:引用时不用加前缀,简单
缺点:容易与当前名称空间的名字冲突
from spam import money as m
from spam import money,read1,read2,change
from spam import * #*包含除了下划线开头以外所有的名字
可以使用__all__来控制*
__all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
5、一个python文件的两种用途
1、当做脚本执行:__name__ == '__main__'
2、当做模块被导入使用:__name__ == '模块名'
if __name__ == '__main__':
pass
6、模块的搜索路径
内存----》内置模块-----》sys.path
1、什么是包
包就是一个包含了__init__.py文件的文件夹(可以往该文件夹下放一堆子模块)
2、包的使用
注意:但凡是在导入时,出现.,这是导入包才有的语法,.的左边必须是一个包,使用的时候没有这种限制
包只是模块的一种形式而已,包的本质就是一种模块
import os
import logging.config
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LOG_PATH=os.path.join(BASE_DIR,'log','access.log')
COLLECT_PATH=os.path.join(BASE_DIR,'log','collect.log')
#定义三种日志输出格式 开始
standard_fORMat = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]'
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
#log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
'id_simple' : {
'format' : id_simple_format
},
},
'filters': {},
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': LOG_PATH, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
'collect': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'simple',
'filename': COLLECT_PATH, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
'': {
'handlers': ['default', 'console','collect'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': False, # 向上(更高level的logger)传递
},
},
}
from conf import settings
import logging.config
def logger_handle(log_name):
logging.config.dictConfig(settings.LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(log_name) # 生成一个log实例
return logger
log_msg = 'eGon给alex转了1毛钱'
#调用日志功能记录日志
#common.logger(log_msg)
logger = common.logger_handle('转账')
logger.debug(log_msg)
Http://www.cnblogs.com/linhaifeng/articles/6384466.html#_label13
重复:.|?|*|+|{m,n}|.*|.*?
.代表任意一个字符
print(re.findall('a.b','a1b a b a-b aaaaaab'))
a.b
print(re.findall('a.b','a1b a b a\nb a-b aaaaaab',re.DOTALL))
a.b
?:代表?号左边的字符出现0次或者1
print(re.findall('ab?','a ab abb abbbb a1b')) #['a','ab','ab','ab','a']
# ab?
*:代表*号左边的字符出现0次或者无穷次
print(re.findall('ab*','a ab abb abbbb a1b')) #['a','ab','abb','abbbb','a']
ab*
+:代表+号左边的字符出现1次或者无穷次
print(re.findall('ab+','a ab abb abbbb a1b')) #['ab','abb','abbbb']
# ab+
{m,n}:代表左边的字符出现m次到n次
print(re.findall('ab{0,1}','a ab abb abbbb a1b')) #['ab','abb','abbbb']
print(re.findall('ab?','a ab abb abbbb a1b')) #['ab','abb','abbbb']
print(re.findall('ab{0,}','a ab abb abbbb a1b')) #['ab','abb','abbbb']
print(re.findall('ab*','a ab abb abbbb a1b')) #['ab','abb','abbbb']
print(re.findall('ab{1,}','a ab abb abbbb a1b')) #['ab','abb','abbbb']
print(re.findall('ab+','a ab abb abbbb a1b')) #['ab','abb','abbbb']
print(re.findall('ab{2,4}','a ab abb abbbb a1b')) #['abb', 'abbbb']
.*:贪婪匹配
print(re.findall('a.*b','xxxy123a123b456b'))
a.*b
.*?:非贪婪匹配
print(re.findall('a.*?b','xxxy123a123b456b'))
|:或者
print(re.findall('compan(y|iess)','too many companiess have gone bankrupt, and the next one is my company'))
print(re.findall('compan(?:y|iess)','too many companiess have gone bankrupt, and the next one is my company'))
#compan(y|iess)
print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击我</a>'))
#在Python中,通常有这几种方式来表示时间:
#1、时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型
#2、格式化的时间字符串(Format String)
#3、结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
import time
#时间戳
print(time.time())
1515724610.869189
#格式化的时间字符串
print(time.strftime("%Y-%m-%d %X"))
2018-01-12 10:42:21
#结构化时间
print(time.localtime()) #本地时区的struct_time
#年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=12, tm_hour=10, tm_min=50, tm_sec=49, tm_wday=4, tm_yday=12, tm_isdst=0)
print(time.gmtime()) #UTC时区的struct_time
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=12, tm_hour=2, tm_min=50, tm_sec=49, tm_wday=4, tm_yday=12, tm_isdst=0)
#其中计算机认识的时间只能是'时间戳'格式
#于是有了下图的转换关系
#将一个时间戳转换为当前时区的struct_time
res1=time.time()
res2=(time.localtime(res1))
print(res2)
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=12, tm_hour=11, tm_min=18, tm_sec=52, tm_wday=4, tm_yday=12, tm_isdst=0)
#再转换为结构化时间
print(time.strftime("%Y-%m-%d %X", res2))
2018-01-12 11:19:48
#datetime模块import datetime
print(datetime.datetime.now())
2018-01-12 11:26:47.797132
print(datetime.date.fromtimestamp(time.time()))
2018-01-12
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分
相关文章