花了不少时间才研究出来的glob, rglob中的正则表达式的其他的一些符号。
一、之前只会用 '*' '*.jpg' '*.txt'等。经过摸索现在又有了 [] ! 两个符号可以使用。
两个细节说明
1、[]中的字符无论有多少个,[]这个代位符都只匹配path中的一个字符。官网和实验都已经证实了的。(但是[!.]是有效的的,[!.]表示除了 . 之外的所有字符)
2、后面是要记录的内容,都使用下面的文件夹结构作为例子
文件夹结构:
代码1:[]的使用
########### []里面的符号表示当前字符只会从[]里面的字符进行匹配。
from pathlib2 import Path
work_path = '/Volumes/qiang/panoimg_20200716/tt'
files_p = Path(work_path).glob('[1t]*')
for file_p in files_p:
print(str(file_p))
返回:
/Volumes/qiang/panoimg_20200716/tt/123 False
/Volumes/qiang/panoimg_20200716/tt/tt False
########### 注意,逗号、空格 也算作和 1t 相同的字符
from pathlib2 import Path
work_path = '/Volumes/qiang/panoimg_20200716/tt'
files_p = Path(work_path).glob('[1, t]*')
for file_p in files_p:
print(str(file_p))
返回:
同上
代码2: !的使用
###### ! 表示排除
# 不适用!的例子
from pathlib2 import Path
work_path = '/Volumes/qiang/panoimg_20200716/tt'
files_p = Path(work_path).glob('*')
for file_p in files_p:
print(str(file_p))
返回:
/Volumes/qiang/panoimg_20200716/tt/.DS_Store
/Volumes/qiang/panoimg_20200716/tt/.2
/Volumes/qiang/panoimg_20200716/tt/123
/Volumes/qiang/panoimg_20200716/tt/tt
对比:(注意其中的[]不可省略)
# 使用!的例子
from pathlib2 import Path
work_path = '/Volumes/qiang/panoimg_20200716/tt'
files_p = Path(work_path).glob('[!.]*')
for file_p in files_p:
print(str(file_p))
返回:
/Volumes/qiang/panoimg_20200716/tt/123
/Volumes/qiang/panoimg_20200716/tt/tt
总之,这两个符号的发现,作用非常大,尤其是在mac、linux系统中。
二、一个易犯的错误:
下面这样是错误的:这样匹配的是c、o、r、n、e、r、4、8每一个字符而不是整个单词
--corner4
|
--1.txt
--2.txt
--corner8
|
--3.txt
--4.txt
--corner
|
--5.txt
--6.txt
上面的例子,遍历corner4、corner8下的文件,而不遍历corner下的文件:
.rglob('*[corner4, corner8]*.jpg') # 第一个星号*,不能省略
不可转载!!!!(或者打赏后转载,缺积分逼的。)
补充一:另一个库:glob库 及三个符号介绍 及 ‘/’妙用
glob是python自带的一个操作文件的相关模块,由于模块功能比较少,所以很容易掌握。用它可以查找符合特定规则的文件路径名。使用该模块查找文件,只需要用到: “*”, “?”, “[]”这三个匹配符;
”*”匹配0个或多个字符;
”?”匹配单个字符;
”[]”匹配指定范围内的字符,如:[0-9]匹配数字。
glob.glob:
返回所有匹配的文件路径列表。它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。下面是使用glob.glob的例子:(重点就是下面的例子)
for xmlPath in glob.glob('/media/ai1/DATAPART11/LIDC-IDRI' +"/*"):
#解释:遍历指定文件夹下所有文件或文件夹
for xmlPath in glob.glob(xmlPath + "/*/*"):
#解释:遍历指定文件夹下的所有文件夹里的所有文件,/*/*可以根据文件夹层数自主设定
img_path = sorted(glob.glob(os.path.join(images, '*.npy')))
#解释:遍历文件夹下所有npy文件
import glob
#获取指定目录下的所有图片
print glob.glob(r"E:/Picture/*/*.jpg") # 这个例子最好
#获取上级目录的所有.py文件
print glob.glob(r'../*.py') #相对路径
从这里学到了如何遍历上面错误代码里面的文件:使用多级‘/’符号,除了这个我没有想到其他更好的方法:
.glob('/absolute_path/??????[48]/*.txt'),总之就是使用‘/’这个符号,让要遍历的字符串格式固定下来,即让一个*、?、[]这几个符号只出现在确定的两个'/'之间,更确切点就是让这三个符号只匹配一个文件夹的名字,而不是多个文件夹的名字。
补充二:pathlib2 Path(base_path)中的rglob(pattern)中的pattern必须是相对于base_path的相对路径
(下面的‘正确2’一定要重点记忆)
例如:遍历下面的图片
--pictures
|
--fold1
| |
| --1.jpg
| --2.jpg
--fold2
|
--3.jpg
--4.jpg
from pathlib2 import Path
work_path = '/code/cfq/pictures'
path_p = Path(work_path)
#错误:imgs_p = path_p.rglob('/code/cfq/pictures/*[12]/*.jpg')
#因为rglob(pattern)的pattern必须是对/code/cfq/pictures之后的路径的
#正确1:
imgs_p = path_p.rglob('*[12]/*.jpg')
#正确2: 这个一定要重点记忆。
imgs_p = path_p.rglob('./*[12]/*.jpg')
原因:pattern要求是一个相对路径,所以可以使用.和.. 其中.表示Path(base_path)里面的base_path
#错误:
imgs_p = path_p.rglob('/*[12]/*.jpg')
原因:此时的路径省略了.变成了绝对路径,rglob(pattern)不允许pattern为绝对路径