Python-路径处理:glob模块、os.path模块
python提供了3个内置库os.path模块,glob模块用于与操作系统路径相关功能
import os
import glob
1 路径概念
1.1 路径分隔符
windows用反斜杠\
表示路径分隔符,linux只用正斜杠/
表示路径分隔符
由于反斜杠在代码中表示转义字符,输入window路径时可以使用两种方式:
- 使用
\\
表示字符\
:path = 'F:\\SoftwareTest\\MyTool'
- 使用
r
表示原始字符:path =r'F:\SoftwareTest\MyTool'
由于路径返回值的分隔符不确定,最好进行检查os.path.abspath(path)
,同时把相对路径变为绝对路径
相关方法:
os模块 | 说明 |
---|---|
os.sep -> str | 路径分隔符,Window平台下为r'\' ,Lunix平台下为/ |
1.2 绝对路径和相对路径
路径包括绝对路径和相对路径
绝对路径r'C:\Documents\Newsletters\Summer2018.pdf'
相对路径r'.\Publications\TravelBrochure.pdf'
当前路径r'.'
相关方法:
os模块 | 说明 |
---|---|
os.path.abspath() -> path | 此方法将输入path转化为所在平台的标准绝对路径。包含3个部分: 1.如果输入的是以 .\ 或者..\ 开头的相对路径,则以WorkDir为base转化为绝对路径2.如果绝对路径中间还含有 .\ 或者..\ 等相对符号,则转化它们3.同时也会切换路径分隔符 4.此函数不校验最终路径是否真实存在 |
1.3上层路径
使用..
表示当前路径的上层路径
上层路径:..\A.text
1.4 调用者路径和被调用者路径
使用a.exe调用b.exe,b.exe中如果出现相对路径,或者b.exe中有获取当前路径的功能,获取到的到底是a.exe还是b.exe的路径,由b.exe的写法决定
所以在写程序时,获取当前路径最好采用获取【被调用者路径】的写法,防止程序被别人调用时出现路径错误
- 以下方式将获得【被调用者路径】,推荐采用:
current_path = os.path.abspath(sys.argv[0])
- 以下方式将获得【调用者路径】,请注意:
path = r'.\MyTool\b.exe' # 相对路径都是调用者路径
current_path = os.getcwd() # 获得调用者路径
current_path = os.path.realpath(__file__))
相关方法:
os模块 | 说明 |
---|---|
os.getcwd() -> path | 函数得到当前工作目录,返回path 注意被调用时,获得调用者路径 |
sys模块 | 说明 |
---|---|
sys.argv[0] -> path | argv[0]永远是被调用的文件地址,获得被调用者路径 |
2 glob模块(内置库)
glob模块是最简单的模块之一,内容非常少。用它可以查找符合特定规则的文件路径名。跟使用windows下的文件搜索差不多。查找文件只用到三个匹配符:*
, ?
, []
。*
匹配0个或多个字符;?
匹配单个字符;[]
匹配指定范围内的字符,如:[0-9]匹配数字
2.1 glob.glob()函数
glob.glob()
返回所有匹配的文件路径列表。它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。下面是使用glob.glob的例子:
import glob
#获取指定目录下的所有图片
print (glob.glob(r"c:\home\*\*.png"),"\n")#加上r让字符串不转义
#获取上级目录的所有.py文件
print (glob.glob(r'..\*.py')) #相对路径
2.2 glob.iglob()函数
glob.glob()
的迭代器版本,返回迭代器,节约内存,使用for
语句遍历其中的内容
import glob
#父目录中的.py文件
f = glob.iglob(r'..\*.py')
for py in f:
print (py)
3 os.path模块(内置库)
3.1 绝对路径和相对路径
os模块 | 说明 |
---|---|
os.path.abspath() -> path | 此方法将输入path转化为所在平台的标准绝对路径。包含3个部分: 1.如果输入的是以 .\ 或者..\ 开头的相对路径,则以WorkDir为base转化为绝对路径2.如果绝对路径中间还含有 .\ 或者..\ 等相对符号,则转化它们3.同时也会切换路径分隔符 4.此函数不校验最终路径是否真实存在 |
3.2 路径字符串拆解合并
os模块 | 说明 |
---|---|
os.sep -> str | 路径分隔符,Window平台下为r'\' ,Lunix平台下为/ |
os.path.split(path) -> [dir, file] | 分离路径的目录名和文件名,返回列表 |
os.path.splitext(path) -> [str, str] | 从路径中分离出扩展名,返回列表,拓展名在[1] |
os.path.dirname(path) -> dir | 返回目录 |
os.path.basename(path) -> file | 返回文件名,包括拓展名 |
os.path.join(dir,file) -> path | 连接目录与文件名或目录,分隔符按平台 |
3.3 路径检测
os模块 | 说明 |
---|---|
os.path.exists(path) -> bool | 检验给出的路径存在,返回布尔值 注意:输入None则报错 |
os.path.isfile(path) -> bool | 检验给出的路径是一个文件,返回布尔值 意:输入None则报错 |
os.path.isdir(path) -> bool | 检验给出的路径是一个目录,返回布尔值 注意:输入None则报错 |