模块
模块这个东西是个新鲜玩意儿,学了两天。
1、os模块---对操作系统进行操作
print(os.getcwd()) #打印当前文件所在位置
os.chdir(r'D:\fullstack_HANJ') #改变当前目录change dir
# print(os.curdir) #打印一个点 current
# print(os.pardir) #打印两个点 parent
# os.makedirs('abc\\hanjie\\woaini') #建立文件夹
#os.removedirs('abc\\hanjie\\woaini') #从左往右依次判断,只能删除空文件
#os.remove('hanjie18.1') #只能删除文件,不能删除文件夹
# os.mkdir('ww') #生成一个文件
# os.rmdir('ww') #删除
# os.mkdir('ww\\hh')
# dirs = os.listdir(r'D:\fullstack_HANJ\week3\day16') #r--raw原生字符串的意思
# print(dirs) #把当前这个文件架下面的所以文件的名字形成一个列表
# os.rename('configparser_module.py','配置文件模块configparser_module.py') #重命名,前面的是原来的名字
info = os.stat('.\\hanjie18.1.py') #文件信息
print(info)
print(info.st_size)
# \ windows下用这个下一个文件夹
# / linux下用这个分
# s = os.sep() #在不同的系统下分隔符不相同
# print(os.sep())
# 'D:%sfullstack_HANJ%sweek3%sday18'%s #用s替换分隔符
# 'r\n\' #windows里面的换行格式
# '\n' #linux下的换行符号
# '\r' #
# os.linesep #换行分隔符
# print(os.pathsep) #;
# print(os.system('dir')) #执行shell命令
# print(os.environ) #环境变量
print(os.path.abspath('./hanjie18.1.py')) #绝对路径
print(os.path.split(r'D:\fullstack_HANJ\week3\day18\hanjie18.1.py')) #把文件和路径分开在元组里面
# print(os.path.dirname('D:\fullstack_HANJ\week3\day18')) #拿上一层的名字
# os.path.join([a,b]) #把两个路径加在一起
2、hashlib---加密文件
m = hashlib.md5()
# print(m)
m.update('hello world'.encode('utf8'))
print(m.hexdigest())
#在python3里面都是存的unicode类型,我update这个的参数一定要是一个bite字节类型,
# python3里面只有两个数据类型类型一个是bite一个spr,python默认utf8编码
#要把unicode类型转换成二进制
#m.update('hello world'.encode('utf8'))
# m.update('alex'.encode('utf8'))
# print(m.hexdigest()) #hex十六进制
# m2=hashlib.md5()
# m2.update("hello worldalex".encode('utf8'))
# print(m2.hexdigest()) #这里m与m2的结果是一样的
# s = hashlib.sha256() #sha256()更加高深的加密方法
# s.update('hello world'.encode('utf8'))
# print(s.hexdigest())
3、sys模块---python解释器进行交互
在运行cmd的时候,python hanjie1.1.py path post
path post 就是加进来的参数
print(sys.argv) #打印的列表[文件名,执行程序的时候加进来的参数]
def post():
print('ok')
def download():
pass
if sys.argv[1]=='post':
post() #这个脚本就是当传入参数的时候就运行某个程序
import time
print(sys.path) #拿模块存储的路径
sys.path.append() #如果想要去哪里找那么就加上
print('ok')
print(sys.version)
print(sys.platform) #能够跨平台的程序就是好程序
if sys.platform==win32:
os.system('dir')
else:
os.system('ls')
4、logging模块---记录下来在自己创建时间改格式(简化这些步骤)
提示也有优先级
import logging #日志
logging.debug('debug message') #CRITICAL > ERROR > WARNING > INFO > DEBUG
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message') #显示在文件上面,显示在屏幕上面
#自己设置,满足自己的需求
import logging
logging.basicConfig(level=logging.DEBUG, #让几个级别都显示出来
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S', #时间
filename='test.log', #记录到某个文件
filemode='a') ## 文件模式,现在不会显示在屏幕上面了而会显示到文件里面去
# 'w'修改,'a'增加,如果没有这条命令那么显示在屏幕上面
# #行号,级别名字,内容
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log') #写日志的路径,进行文件输出
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler() #屏幕输出
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter) #文件输出的格式
ch.setFormatter(formatter)
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)
logger.setLevel(logging.DEBUG) #把输出等级降到最低
银行卡的信息
def get_logger(card_num, struct_time):
if struct_time.tm_mday < 23:
file_name = "%s_%s_%d" %(struct_time.tm_year, struct_time.tm_mon, 22)
else:
file_name = "%s_%s_%d" %(struct_time.tm_year, struct_time.tm_mon+1, 22)
file_handler = logging.FileHandler(
os.path.join(settings.USER_DIR_FOLDER, card_num, 'record', file_name),
encoding='utf-8'
)
fmt = logging.Formatter(fmt="%(asctime)s : %(message)s")
file_handler.setFormatter(fmt)
logger1 = logging.Logger('user_logger', level=logging.INFO)
logger1.addHandler(file_handler)
return logger1
logger = get_logger()
logger.info()
5、配置文件模块--可以生成的文件是像是清单一样-一般存基本路径,产品列表,平常变更的比较多
创建字典
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9'}
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)
print(config.sections()) #打印除开默认的几个键
print(config.defaults()) #打印默认下面的东西
print(config['bitbucket.org']['User']) #打印键下面的值
config.remove_section('topsecret.server.com') #移除
print(config.has_section('topsecret.server.com'))
config.write(open('example.ini',"w"))
# config.set('bitbucket.org','user','hanjie') #修改值
# config.remove_option('bitbucket.org','user') #删除
config.write(open('example.ini',"w"))#名字相同不是修改而是覆盖
6、正则表达式--re--模糊匹配
s = 'hello world'
print(s.find('llo'))
ret = s.replace('ll','xx')
print(ret)
print(s.split('w')) #分割成列表的项
string提供的方法是完全匹配
ret = re.findall('alex','dsfawdefealexfasdwdw') #查找alex
print(ret)
. 通配符
ret = re.findall('w.l','hello w\nld') #只有换行符不能匹配
print(ret)
^从头开始
ret = re.findall('^h...o','hahdhahuiajhello')
print(ret) #只对第一位进行匹配
$从尾开始
ret = re.findall('a..x$','hdasdsagalexdahkjdhkk')
print(ret) #从最后开始找
*:重复匹配[0,正无穷],星号前面随便有几个这个东西都可以匹配
ret = re.findall('.*','jdjwiljdibjkbaaaaaaa') #*前面的随便你重复
print(ret)
+ 至少得一个,一到无穷
ret = re.findall('a+b','dsahjdsugab')
print(ret)
#?[0,1] 一个或者没有
# ret = re.findall('a?b','dsahjdaaaaabsubgab')
# print(ret)
#{}
ret = re.findall('a{1,3}b','aaaaaab') #默认按照最高的匹配,贪婪匹配
print(ret)
#字符集
#[]代表或的关系;[]取消元字符的特殊功能,(\ ^ -)例外
# ret = re.findall('a[c,d]x','acx') #只能多选一
# print(ret)
# ret = re.findall('[w,*]','wacx*') #[]取消元字符的特殊功能
# print(ret)
# ret = re.findall('[1-9,a-z,A-Z]','dsaffww4546sds') #([1-9a-zA-Z])一样
# print(ret)
#^放在中括号里面意味着取反,除了t全可以取出来
# ret = re.findall('[^t]','dhadhl')
# print(ret)
# ret = re.findall('[^4,5]','233445678') #非4和非5
# print(ret)
# \
反斜杠后边跟元字符去除特殊功能
反斜杠后面跟这个普通字符实现特殊功能
# 在正则表达式里面提供的
# \d 匹配任何十进制数;if 它相当于[0 - 9]:
# \D 匹配任何非数字字符;它相当于类[^0-9].
# \s 匹配任何空白字符;它相当于类[\t\n\r\f\v]
# \S 匹配任何非空白字符;太相当于类[^ \t\n\r\f\v]
# \w 匹配任何字母数字字符;它相当于类[a-zA-Z0-9 ]
# \W 匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9 ]
# \b 匹配一个单词边界,也就是指单词和空格间的位置
print(re.findall('\d{11}','skdmlksndiisjdoijsodns2324343344657854567895678465656')) #>>['23243433446', '57854567895']
print(re.findall('\sasd','fak asd')) #>>>[' asd']
print(re.findall('\w','fak asd')) #>>>['f', 'a', 'k', 'a', 's', 'd']
print(re.findall(r'I\b','hello,I am a LI$T ')) >>>['I', 'I'] 带着特殊字符的
search匹配出第一个满足条件的结果
set = re.search('sb','dbskbjksbhiiosb')
print(set) #<re.Match object; span=(7, 9), match='sb'>
print(set.group())
ret = re.search('a\.','a.gj').group()
print(ret) #打印点出来
() 集合
print(re.search('(as)+','sdjkfasas').group()) #asas
print(re.search('(as)|3','3').group()) #|或 先匹配在前面的
死格式
ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo')
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))
# # 正则表达式的方法
# 1,findall(): 所有的结果都返回到一个列表里面
# 2,search(): 返回匹配打牌的第一个对象(object),对象可以调用group()返回结果
# 3,match(): 只在字符串开始匹配
# ret = re.match('asd','asdjshjfasd')
# print(ret.group())
# 4, split()
# ret = re.split('[k,s]','djkasl') #>>>['dj', 'a', 'l']
# print(ret)
#
# ret = re.split('k','djkasl') #>>>['dj', 'asl']
# print(ret)
#
# ret = re.split('[k,s]','sdkasl') #>>>['', 'd', 'a', 'l']
# print(ret)
#
#
# # 5, sub
# ret = re.sub('a..x','s..b','dsakdalexsakds')
# print(ret)
# # 6, compile
# obj = re.compile('\.com')
# ret = obj.findall('dnslds.comdsjdksl')
# print(ret)

浙公网安备 33010602011771号