Python学习 DAY 18 os模块,sys模块,hashlib模块,logging模块,正则表达式

***********************************os模块********************************************

os.getcwd()   文件所处的路径

os.chdir(‘r/c:user’)   改变工作目录

os.curdir   返回当前路径

os.pardir   返回两层目录

os.mkdir('xxx')  生成一个文件夹

os.makedirs('abc\\alex')   生成一个两层文件夹,在当前路径下

os.rmdir()删除一个空文件夹

os.removedirs('abc\\alex\\alvin')  先判断是否为空文件夹,空文件夹则删掉;如果有内容,则不删

os.listdir() 列出当前路径所有文件夹,放在一个列表里

os.remove() 删除文件,不能删文件夹

os.rename("oldname","newname")  文件改名字

os.stat('xxx')  获取文件信息,可获取文件大小,时间

os.sep  获取当前系统的路径分隔符,win\\,Linux/

os.linesep  获取当前系统的换行分隔符  window:\r\n;Linux:\n;mac:\r

os.pathsep  当前平台分割文件路径字符串

os.system  执行shell命令,即cmd-python

os.environ   环境变量

os.path.abspath()    拿相对路径的绝对路径

os.path.split()  将文件名和路径分割

os.path.dirname(‘路径’)  取出文件所在的文件夹的绝对路径

os.path.basename(path)   取出path最后的文件名

os.path.exists(path)  判断是否存在当前路径,存在返回TRUE

os.path.isabs(path)  判断是否为绝对路径,是为true

os.path.isfile(path)  判断path是否为存在的文件,是为true

os.path.isdir(path)  判断path是否为存在的目录,是为true

os.path.join.([a,b])   路径拼接*******************

os.path.getatime(path)   path指向文件的存取时间

os.path.getmtime(path)   path指向文件的修改时间

***********************************sys模块(与python解释器进行交互)************************

sys.argv   命令行参数list,第一个元素是程序本身路径

sys.exit(n)  退出程序,正常退出时exit(0)

sys.path  搜寻模块路径的列表

sys.platform  显示当前平台

***********************************hashlib模块(加密)***********************

1.md5算法

m=hashlib.md5     拿到md5对象

m.update('hello world'.encode('utf8'))

m.hexdigest()  ======一堆十六进制密文

2.sha算法

s=hashlib.sha256()

s.update('hello world')

s.hexdigest() =========密文

 ***********************************logging模块(日志)***********************

五种日志级别
logging.debug('debug message') 默认不打印 logging.info('info message') 默认不打印 logging.warning('warning message'(可按需求修改)) logging.error('error message') logging.critical('critical message')

基本的日志配置:

logging basicconfig(level=xxxxxxxx(级别,logging.DEBUG),

         format=%(asctime)s %(filename)s %s[line:%lineno)d] %(levelname)s  %(message)

         datefmt='%Y %H'  时间格式

         filename='/tmp/test.log'   文件名及位置 ,不写这行则在屏幕输出

         filemode='a'  写入文件模式,不删除旧的

filename   带着路径的文件名

filemode   文件打开方式,默认为a

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用户输出的消息

屏幕和文件同时输出的方式:***

import logging

logger = logging.getLogger()  创建一个logger对象

# 创建一个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)#设定logger级别
logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message')
 ***********************************configParser模块(配置文件)***********************
import configparser
  
config = configparser.ConfigParser()
config["DEFAULT"= {'ServerAliveInterval''45',
                      'Compression''yes',
                     'CompressionLevel''9'}
                     创建大字典
config['bitbucket.org'= {}
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'<br>
with open('example.ini''w') as configfile:
   config.write(configfile)
增删改查:
        config.read(example.ini),默认的不会拿出default
  print(config.sections())读两个大部分
  print(config.defauls()) 读取default中的具体键值对

import configparser

config = configparser.ConfigParser()

#---------------------------------------------查
print(config.sections()) #[]

config.read('example.ini')

print(config.sections()) #['bitbucket.org', 'topsecret.server.com'] 取块

print('bytebong.com' in config)# False

print(config['bitbucket.org']['User']) # hg 取块下面的值

print(config['DEFAULT']['Compression']) #yes

print(config['topsecret.server.com']['ForwardX11']) #no


for key in config['bitbucket.org']:
print(key)    打印default和bitbucket.org中地所有键,default一直跟着


# user
# serveraliveinterval
# compression
# compressionlevel
# forwardx11


print(config.options('bitbucket.org'))#['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11']
print(config.items('bitbucket.org')) #[('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')]

print(config.get('bitbucket.org','compression'))#yes


#---------------------------------------------删,改,增(config.write(open('i.cfg', "w")))


config.add_section('yuan')

config.remove_section('topsecret.server.com')

config.has_section('topsecret.server.com')   false  是否有字符串
config.remove_option('bitbucket.org','user')

config.set('bitbucket.org','k1','11111')   找到bitbucket.org下的k1键,修改为11111

config.write(open('i.cfg', "w"))   必须重新生成一个文件,文件内容不能被修改,只能被覆盖

增删改查

************************************************正则表达式*******************************
一、
1 正则表达式是用来干嘛的?
  匹配   字符串的
2 为什么引用正则表达式
  字符串提供的方法是完全匹配,一对一。
  为了进行模糊匹配,更强大的匹配
二、
impot re
re.findall(规则,内容,flag) (‘w\w{2}l’,'hello world),flag修改规则,基本不用
元字符:.   ^    $    *    +    ?    {    }     [    ]      |    (  )     \
.通配符
re.findall ('w..l','hello world')   .代指任意一个字符,除了换行符\n
^尖角符
re.findall('^h...o','hjijiojhello')  尖角符只在开始进行匹配
re.findall('h...o$','hjijiojhello')  $只在最后进行匹配
*重复匹配    +    ?    {    }
re.findall('h.*o','hjijiojhello')  重复的.......用.*代替  重复匹配范围【0,无穷】ab*  可匹配到a,尽可能多匹配,即贪婪匹配
+,【1,无穷】重复   ab+  可匹配到ab
?,【0,1】可以0个或1个,多了匹配不出来。
前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?使其变成惰性匹配
{},匹配几次自己定,a{5},匹配5个a;a{1,3},1到3次a,有1 有3按最大的匹配,即贪婪匹配
结论:*等于{0,正无穷}     +等于{1,正无穷} 等于{1,}     ?等于{0,1}   
推荐*、+、?
[]字符集
或的关系 【ab】a或b  [a-z]  a到z,不用加逗号,逗号本身也是个普通字符
特殊功能:取消元字符的特殊功能 (三个例外:\,^,-)【w,*】
     ^放在中括号里意味着取反[^45]非4,5以外的所有
\斜杠(最重要)
  1.反斜杠后边跟元字符去除功能
  2.反斜杠后边跟普通字符实现特殊功能
\d 匹配任何十进制数,【0-9】re.findall(‘\d{11}’a1324234234234234)
\D 匹配任何非数字字符,【^0-9】
\s 匹配任何空白字符,【\t\n\r\f\v】re.findall
\S 匹配任何非空白字符,【^\t\n\r\f\v】
\w 匹配任何字母数字字符,【a-zA-Z0-9】
\b 匹配一个单词边界,特殊字符的边界,也就是指单词和空格间的位置  re.findall(r'I\b','hello,I am a LIST),匹配I单词,如果是LI$T,也能匹配到
以上均为正则表达式提供的语法规范
 
ret=re.search()   找第一个符合条件的,其余不管。返回一个对象
ret.group()  查看结果,没有匹配到则报错
 
匹配\
re.findall ('\\\\','adhf\c') ==\\
re.findall (r'\\','adhf\c') ==\\
 
()做分组
re.search('(as)+','sadasdasdasd')   以as为组进行匹配
命名分组
 ret=re.search('(?P<name>\w{2}/?P<age>\d{2})','45bd/34h"ab"3')   ret=bd/34
print(ret.group('name'))
 
re.findall('www.(\w+).com','www.baidu.com') ====baidu 只取组里的内容
re.findall('www.(?:\w+).com','www.baidu.com') ====www.baidu.com 只取组里的内容
******************************************正则表达式的方法*************************************
1  findall():    所有结果都返回到一个列表里面
2  search(): 返回一个对象,对象可以调用group()返回结果,返回第一个对象
3 match():只在字符串开始匹配,也只返回一个对象,也用group
  re.match('asd','asdasdasd')    
4 split():
  re.split('[j,s]','djksal')==d,k,al
  re.split('[j,s]','sdjksal')=='', d, k, al
5  sub   替换
  re.sub('原内容‘,‘要替换的内容’,‘xxxx’,替换多少次(默认全替换))
  re.subn('原内容‘,‘要替换的内容’,‘xxxx’,替换多少次(默认全替换)),返回替换了多少次
6 compile
  obj=re.compile(\.com)
  obj.finall('asdasdadad')
7 finditer
re.finditer('\d','ds3sy4784a')  返回一个迭代器
print(next(ret))
 
posted @ 2020-06-20 21:55  小将博杨  阅读(154)  评论(0)    收藏  举报