首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从不同的目录中检索相同的文件名(例如- a.xyz),唯一不同的是后缀(例如- surf_001,surf_002,surf_003)

从不同的目录中检索相同的文件名(例如- a.xyz),唯一不同的是后缀(例如- surf_001,surf_002,surf_003)
EN

Stack Overflow用户
提问于 2021-02-22 11:07:34
回答 1查看 16关注 0票数 0

我有一个目录,其子目录如下所示。

代码语言:javascript
复制
my_directory/  
├── surf_001/  
|     ├── a.xyz  
├── surf_002/.  
|     └── a.xyz  
├── surf_003/  
|     ├── a.xyz

我可以检索surf_001的a.xyz,到目前为止,我的代码如下所示

代码语言:javascript
复制
import numpy as np  
import glob  
import os

num ='1'  
print(num.zfill(3))

file=os.path.join('/home', 'sg', 'scratch', 'slabs', 'cool_100', 'surf_001', 'a.xyz')  
print(file)

filenames = glob.glob(file)   
print(filenames)

oh_den=[]  
count=0  
for lines in filenames:       
    outfile = open(lines,'r')   
    data = outfile.readlines()  
    outfile.close()   
    for f in data:   
        if 'H' in f:      
            count = count + 1  
    print(count)  

这给了我想要的第一个文件夹,谁能告诉我如何编辑这个获得其他文件。我有最多到surf_100的文件夹

EN

回答 1

Stack Overflow用户

发布于 2021-02-22 14:50:51

对于内置的glob来说,这是一个有点困难的情况,但并非不可能。尽管如此,有一个名为wcmatch的Python库可以让这件事变得更容易(完全公开,我是这个库的作者)。

这个库允许您通过EXTGLOB标志实现extended globbing。为了演示,我们将使用globmatch函数来匹配一些文件:

代码语言:javascript
复制
>>> from wcmatch import glob
>>> glob.globmatch('my_directory/surf_100/a.xyz', '**/surf_+([0-9])/a.xyz', flags=glob.GLOBSTAR | glob.EXTGLOB)
True
>>> glob.globmatch('my_directory/surf_003/a.xyz', '**/surf_+([0-9])/a.xyz', flags=glob.GLOBSTAR | glob.EXTGLOB)
True

如您所见,我们使用的是+(...)模式,它类似于在正则表达式中执行类似于(...)+的操作。从本质上说,我们想要一个或多个包含在模式列表中的内容。在我们的模式列表中,它是数字。

在您的例子中,您可能需要如下所示:

代码语言:javascript
复制
from wcmatch import glob
file = '/home/sg/scratch/slabs/cool_100/surf_+([0-9])/a.xyz'
filenames = glob.glob(file, flags=glob.EXTGLOB)

还有其他方法可以做到这一点,例如使用大括号扩展。这有点效率较低,因为它进行模式扩展,将一个模式转换为多个模式,但允许您灵活地指定一个范围。

代码语言:javascript
复制
>>> glob.globmatch('my_directory/surf_003/a.xyz', '**/surf_{001..100}/a.xyz', flags=glob.GLOBSTAR | glob.BRACE)
True
>>> glob.globmatch('my_directory/surf_101/a.xyz', '**/surf_{001..100}/a.xyz', flags=glob.GLOBSTAR | glob.BRACE)
False

如果使用外部库不是一种选择,我相信将会有大量的答案来展示如何使用常规的glob来做到这一点,但我想他们可能不会那么简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66309542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档