Python - 模块(二)

目录

  • Python - 模块(二)

    • re

      • re下面的方法
    • logging
    • os

Python - 模块(二)

re

re模块提供了正则表达式的相关操作

主要字符介绍:

. 通配符,除了换行符之外的任意字符

^ 匹配字符串的开始

$ 匹配字符串的结尾

关于次数的:

* 按紧挨着的字符重复无数次, 重复零次或更多次

+ 1到无穷次, 重复一次或更多次

? (0,1) 重复零次或一次

{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

其他的:
[] 字符集
|
() 分组
\ 转义

\A 只在字符串开始进行匹配

\Z 只在字符串结尾进行匹配

\b 匹配一个特殊字符边界, 如空格$

\B 匹配不位于开始或结尾的空字符串

\d 相当于[0-9]

\D 相当于[^0-9]

\s 匹配任意空字符串:[\t\n\r\v]

\S 匹配任意非空白字符:[^\t\n\r\v]

\w 匹配任意数字和字母: [a-zA-Z0-9]

\W 匹配任意非数字和字母: [^a-zA-Z0-9]

. ^ $ * + ? {} 一些用法
import re
print(re.findall("a..x","helloalex"))#['alex']  点匹配任意一个,但是只能匹配一个

print(re.findall("^a..x","alexhelloworld"))#['alex'] ^ 匹配以什么开始

print(re.findall("a..x$","helloalex"))#['alex'] $ 匹配以什么结尾

print(re.findall("alex*","helloalexxxxx"))#['alexxxxx'] * 贪婪匹配 *表示匹配0次或更多次

print(re.findall("alex+","helloalexxx"))#['alexxx'] +表示匹配1次或更多次

print(re.findall("alex?","helloalexxxx"))#['alex'] ? 表示匹配0到1次

print(re.findall("alex{1,2}","alexxxx"))#['alexx']

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

元字符之字符集[]

存在或的关系    至少匹配一个   在字符集中含有特殊意义的只有三个 ^(非) \(转义) -(范围)

print(re.findall('a[bc]d','acd'))#['acd']  []字符集中有或的概念

print(re.findall('[a-z]','acd'))#['a', 'c', 'd'] #范围a—z 都可以匹配到

print(re.findall('[.*+]','a.cd+'))# ['.', '+']

print(re.findall('[1-9]','45dha3'))# ['4', '5', '3']

print(re.findall('[^ab]','45bdha3'))# ['4', '5', 'd', 'h', '3']   ^ 代表非的概念

print(re.findall('[\d]','45bdha3'))# ['4', '5', '3']  \d 表示0到9的数字

关于转义的实例

import re
ret=re.findall(‘c\l‘,‘abc\le‘)
print(ret) # 报错
ret=re.findall(‘c\l‘,‘abc\le‘)
print(ret) # 报错
ret=re.findall(‘c\\l‘,‘abc\le‘)
print(ret) #[‘c\l‘]
ret=re.findall(r‘c\l‘,‘abc\le‘)
print(ret)#[‘c\l‘] # 一张图解释为什么要用到这么多 ?的原因

分组() 的用法

print(re.findall(r'(ad)+', 'addad')) # ['ad', 'ad']

ret=re.search('(?P<id>\d{2})/(?P<name>\w{3})','23/com')
print(ret.group())#23/com
print(ret.group('id'))#23

| 或

ret=re.search('(ab)|\d','rabhdg8sd')
print(ret.group())#ab    先匹配到哪个取哪个  group表示取值

re下面的方法

comoile

obj=re.compile('\d{5}')       # compile是编译的意思,编译好一个规则,再进行调用它
ret=obj.search('abc12345ee')
print(ret.group())#12345

serch

print(re.search('al','alvin yuan').group()) # al

# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

findall

print(re.findall('a','alvin yuan'))# ['a', 'a']

# 返回所有满足匹配条件的结果,放在列表里

match

ret = re.match('a','abc').group() # match只是从开始匹配,匹配成功则返回对象
print(ret)

split

ret=re.split('[ab]','abcd')     # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)#['', '', 'cd']       # 结果放在列表中

sub(subn)

ret=re.sub('\d','abc','alvin5yuan6',1)   # sub里面至少有个三个参数 依次是 匹配规则 替换内容 源数据     也可以有四个,最后一个参数是匹配次数
print(ret)#alvinabcyuan6
ret=re.subn('\d','abc','alvin5yuan6')    # 显示匹配了多少次,替换
print(ret)#('alvinabcyuanabc', 2)

finditer

ret=re.finditer('\d','ds3sy4784a')
print(ret)        #<callable_iterator object at 0x10195f940>
print(next(ret).group())
print(next(ret).group())

# 结合迭代器规则,返回的是一个迭代器对象,应用于处理很多的数据,用next的可以逐一取

?: 是取消优先级 ?P的含义

print(re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir27").group("name"))
# alex 注释 ?P是定义死的 <定义分组名>                                 后面可根据分组名取值

print(re.findall("www\.(baidu|taobao)\.com","sdaswww.baidu.comsdf"))
# ['baidu'] 优先给分组的内容,其实已经匹配到了
print(re.findall("www\.(?:baidu|taobao)\.com","sdaswww.baidu.comsdf"))
# ['www.baidu.com']    ?: 表示去掉括号内的优先级

logging

用于便捷记录日志且线程安全的模块

日志级别大小关系为:CRITICAL ERROR WARNING INFO DEBUG NOTSET,当然也可以自己定义日志级别。

level=logging.DEBUG 设置日志级别

import logging

logging.basicConfig(filename='log.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=logging.DEBUG)

logging.debug('debug')            # 分五个等级
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')

文件输出如下:

format 设置输出格式

 %(levelno)s: 打印日志级别的数值
 %(levelname)s: 打印日志级别名称
 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 %(filename)s: 打印当前执行程序名
 %(funcName)s: 打印日志的当前函数
 %(lineno)d: 打印日志的当前行号
 %(asctime)s: 打印日志的时间
 %(thread)d: 打印线程ID
 %(threadName)s: 打印线程名称
 %(process)d: 打印进程ID
 %(message)s: 打印日志信息

datefmt 设置日期格式,同 time.strftime()

  %Y 年 %m 月  %D日  %H时  %M分  %S 秒

filename 设置文件路径

filemode 设置文件打开模式

注:没有filename和filemode直接输出

os

用于提供系统级别的操作

os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
os.curdir                   返回当前目录: ('.')
os.pardir                   获取当前目录的父目录字符串名:('..')
os.makedirs('dir1/dir2')    可生成多层递归目录
os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ***
os.remove()                 删除一个文件
os.rename("oldname","new")  重命名文件/目录 ***
os.stat('path/filename')    获取文件/目录信息,相关信息的介绍 size 文件大小 atime 上次访问时间 mtime 上次修改时间 ctime 查看创建时间
os.sep                      操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep                  当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep                  用于分割文件路径的字符串
os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")   运行shell命令,直接显示
os.environ                  获取系统环境变量
os.path.abspath(path)       返回path规范化的绝对路径
os.path.split(path)         将path分割成目录和文件名二元组返回
os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path)      返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)         如果path是绝对路径,返回True
os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略,涉及文件路径拼接就用它
os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

上图所示, 是得到:

os.path.dirname是返回上一级目录

获取文件大小的三种方式

import os

res = os.path.getsize(os.path.join("F:\python\PycharmProjects\date2017.1.8","path_search.py"))
print(res)

ret  = os.stat(os.path.join("F:\python\PycharmProjects\date2017.1.8","path_search.py")).st_size
print(ret)

f = open(os.path.join("F:\python\PycharmProjects\date2017.1.8","path_search.py"),"rb")
print(len(f.read()))

输出结果相同

os模块的补充

os.walk(top, topdown=True, onerror=None, followlinks=False)
可以得到一个三元tupple(dirpath, dirnames, filenames),
第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
dirpath 是一个string,代表目录的路径,
dirnames 是一个list,包含了dirpath下所有子目录的名字。
filenames 是一个list,包含了非目录文件的名字。
这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name).
通过for循环自动完成递归枚举

# 做个简单的例子,输出crm目录的下所有文件的路径信息
for a,b,c in os.walk(str(PATH) + os.sep + "crm" ):
    for item in c:
        # print(item)
        print(os.path.join(a,item))

输出
F:\python\crm\.idea\.name
F:\python\crm\.idea\crm.iml
F:\python\crm\.idea\encodings.xml
F:\python\crm\.idea\misc.xml
F:\python\crm\.idea\modules.xml
F:\python\crm\.idea\workspace.xml
F:\python\crm\bin\bin.py
F:\python\crm\bin\__init__.py
F:\python\crm\bin\__pycache__\bin.cpython-35.pyc
F:\python\crm\core\admin.py
F:\python\crm\core\coures.py
F:\python\crm\core\grade.py
F:\python\crm\core\school.py
F:\python\crm\core\student.py
F:\python\crm\core\teacher.py
F:\python\crm\core\__init__.py
F:\python\crm\core\__pycache__\admin.cpython-35.pyc
F:\python\crm\core\__pycache__\coures.cpython-35.pyc
F:\python\crm\core\__pycache__\grade.cpython-35.pyc
F:\python\crm\core\__pycache__\school.cpython-35.pyc
F:\python\crm\core\__pycache__\student.cpython-35.pyc
F:\python\crm\core\__pycache__\teacher.cpython-35.pyc
F:\python\crm\core\__pycache__\__init__.cpython-35.pyc
F:\python\crm\db\admin\alex
F:\python\crm\db\coures\23eeeb4347bdd26bfc6b7ee9a3b755dd
F:\python\crm\db\coures\34d1f91fb2e514b8576fab1a75a89a6b
F:\python\crm\db\coures\c71e8d17d41c21de0d260881d69662ff
F:\python\crm\db\coures\df5fb5e33c5585bb0c48107c57cece9b
F:\python\crm\db\coures\e206a54e97690cce50cc872dd70ee896
F:\python\crm\db\grade\270c42ba7614f1a475f61dfcb397a621
F:\python\crm\db\grade\817ee0b8010393ff3b4483e703663551
F:\python\crm\db\school\17811d3caeff9648f48b5a553c806c63
F:\python\crm\db\school\b035c88ee6f5270ccff67a591d0e21ec
F:\python\crm\db\school\bb0ac3d8eb8f2c2f6fe336c5e9957392
F:\python\crm\db\school\e523d5f211747bdfc742f50463577f74
F:\python\crm\db\student\6e7e12c264fb3e1f456b0782f47e4af6
F:\python\crm\db\student\a0b5e2d3a97d7a19ec6d2da830f609b2
F:\python\crm\db\student\a995b03ed63f8c7128a83c984b89aa50
F:\python\crm\db\student\fe01b2ba5ec0146e5d4b0885822556ef
F:\python\crm\db\student\ff4916088e836d268a9d72f8929bac06
F:\python\crm\db\teacher\08319d4fed47c8ed828ebabd5a91563b
F:\python\crm\db\teacher\0d1d5cd3623144f692fb771580b92288
F:\python\crm\db\teacher\5d00d0762936aedda519d63c2e4a2a40
F:\python\crm\db\teacher\6a7ece82e4ed94a475dab275891d5036
F:\python\crm\lib\ceshi.py
F:\python\crm\lib\readme
F:\python\crm\lib\readwrite.py
F:\python\crm\lib\__init__.py
F:\python\crm\lib\__pycache__\readwrite.cpython-35.pyc
F:\python\crm\lib\__pycache__\__init__.cpython-35.pyc

原文地址:https://www.cnblogs.com/konghui/p/10351865.html

时间: 2024-10-03 16:04:00

Python - 模块(二)的相关文章

python 模块二

#################################总结##################### pickle(重点) 把一个对象进行序列化操作 1. dumps() 把对象序列化成字节 2. loads() 把字节反序列化成对象 3. dump() 把对象序列化写入文件 4. load() 把文件中的内容反序列化成对象 json(重点中的重点) json你可以认为是python中的字典. 有一点点的不一样 python: True, False, None json: true

万恶之源 - Python模块二

shelve 我们之前学了json和pickle模块 这些都是序列化的模块,咱们进行在讲一个序列化的东西 叫做shelve 你们肯定有个疑问,这个东西和那个类似为什么要讲.是因为这个模块比较简单的,并且你们后期存储数据的时候需要使用数据库,但是当数据较少的时候我们就可以不用通过网络去和数据库进行交互了.直接使用咱们本地的文件就可以了 好了,我们现在来看看这个有多简单. 首先我们要import shelve这个模块,然后就像操作文件一样就可以啦.好我们来试试 import shelve f = s

python的logging日志模块(二)

晚上比较懒,直接搬砖了. 1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 屏幕上打印:WARNING:root:This is warning message 默认情况下,logging将日志打印到屏幕,日志级别为WARNING: 日志级别大小关系为:

python实现简单爬虫(二)---- 使用urllib等python模块

之前使用scrapy实现了一个超级简单的爬虫工具,用于抓取豆瓣上面所有的编程书籍信息(由于不需要爬取整个页面的所以链接,所以不需要用到BFS or DFS,只实现顺序抓取下一页) 这次使用的是python自带的urllib 和urllib2等python模块实现,同样以豆瓣上面的爱情电影信息作为爬取对象,方法与过程其实如出一辙,同样是对每一个页面发出请求后获取响应得到的网页源码,再使用正则表达式去匹配获得所需信息,然后获取下一页的链接继续爬取. 爬取页面: 网页源码: title and lin

OpenCV和Zbar两个Python模块实现二维码和条形码识别

在我们的日常生活中,处处可见条形码和二维码. 在以前,我们去逛书店时,或者你现在随手拿起你身边的一本书,你肯定能看到书本的封页后面印有一排黑色线条组成的标签,也就是条形码:你去你们学校的自助机上借书还书时识别的也是条形码:哦,对了,你还记得每次大型考试答题卡上都会贴上监考老师分发给你的那个标签吗?还是条形码:甚至现在你随随便便逛个超市或便利店,收银员或者自助机也都是通过扫商品条形码给你计价的.条形码在我们的日常生活中真的是随处可见. 到了后来,2016年之后,二维码也渐渐开始普及起来,现在二维码

python中几大模块二

python中几大模块二 sys模块 sys模块也是python种一个非常强大的模块,功能非常的多,这里我其实也没接触到几个,暂时记录一下目前常用的几个功能函数. sys.argv 这个函数的功能是在程序外部向程序内部传递参数 .例如: import sys print(sys.argv[:]) print(sys.argv[0]) print(sys.argv[1]) print(sys.argv[2]) print(sys.argv[3]) #外部调用解释器执行该文件 python test

如何用C++ 写Python模块扩展(二)

Python模块包含的类创建(下) 类的方法表创建 直接上代码 static PyMethodDef VCam_MethodMembers[] = //类的所有成员函数结构列表同样是以全NULL结构结束 { { "set_fill", (PyCFunction)VCam_SetFill, METH_VARARGS, "Set video resize method (0: Aspect fit, 1: Aspect fill, 2: Stretch), used when i

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

4.python模块

python 字符串 一.注释 在python中的注释分为单行注释和多行注释    (1)单行注释:为在语句的前边加"#" 例子: #!/usr/bin/env python a = 123 print a #print a #print a #print a 执行结果如下: [[email protected] ~]# python a.py 123  (2)多行注释:可以用3对单引号(比如:''' 注释内容''') 或是3对双引号(比如:"""注释内容