Python常用模块-2

本节目录

  • 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
用os.walk 遍历目录
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()))

输出结果相同
获取文件大小的三种方式

本节目录

  • 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
用os.walk 遍历目录
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()))

输出结果相同
获取文件大小的三种方式

猜你喜欢

转载自www.cnblogs.com/zhangliang91/p/10547442.html