pathlib2 Path glob rglob的最新研究成果 以及 glob库的基础使用

花了不少时间才研究出来的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为绝对路径

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值