python笔记(九):基础模块(一)

python基础之模块系列(二)

本节目录

  • re
  • logging
  • os

re

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

是直接面向字符串的模糊匹配

元字符包含有 . ^ $ * + ? {} [] | () \

介绍字符

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

^ 匹配字符串的开始

$ 匹配字符串的结尾

关于次数的

  • 按紧挨着的字符重复无数次 重复零次或更多次
  • 1到无穷次 重复一次或更多次

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

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

其它的:

[] 字符集 | 或 () 分组 \ 转义

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

|

. ^ $ ``* + ? {} 一些用法

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']

—|—

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

|

元字符之字符集[]

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

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的数字

—|—

1

2

3

4

5

6

7

8

9

10

|

关于转义的实例 \

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'] # 一张图解释为什么要用到这么多 \ 的原因

—|—

1

2

3

4

5

6

7

|

分组() 的用法

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

—|—

1

2

3

4

|

| 或

ret``=``re.search(``'(ab)|\d'``,``'rabhdg8sd'``)

print``(ret.group())``#ab 先匹配到哪个取哪个 group表示取值

—|—

re下面的方法

常用的功能函数包括:compile、 search 、match、split、 findall (finditer)、sub(subn)

comoile

1

2

3

|

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

ret``=``obj.search(``'abc12345ee'``)

print``(ret.group())``#12345

—|—

serch

1

2

3

4

|

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

# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以

# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

—|—

findall

1

2

3

|

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

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

—|—

match

1

2

|

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

print``(ret)

—|—

split

1

2

|

ret``=``re.split(``'[ab]'``,``'abcd'``) ``# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割

print``(ret)``#['', '', 'cd'] # 结果放在列表中

—|—

sub(subn)

1

2

3

4

|

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

print``(ret)``#alvinabcyuan6

ret``=``re.subn(``'\d'``,``'abc'``,``'alvin5yuan6'``) ``# 显示匹配了多少次,替换

print``(ret)``#('alvinabcyuanabc', 2)

—|—

finditer

1

2

3

4

5

6

|

ret``=``re.finditer(``'\d'``,``'ds3sy4784a'``)

print``(ret) ``#<callable_iterator object at 0x10195f940>

print``(``next``(ret).group())

print``(``next``(ret).group())

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

—|—

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

1

2

|

print``(re.search(``"(?P<name>[a-z]+)(?P<age>\d+)"``,``"alex36wusir27"``).group(``"name"``))

# alex 注释 ?P是定义死的 <定义分组名> 后面可根据分组名取值

—|—

1

2

3

4

|

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 设置日志级别

1

2

3

4

5

6

7

8

9

10

11

12

13

|

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

用于提供系统级别的操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

|

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是返回上一级目录

关于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

复制代码

复制代码

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()))

输出结果相同

复制代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值