微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从不同的目录中检索相同的文件名例如 - a.xyz,唯一的区别是后缀例如 - surf_001、surf_002、surf_003

我有一个包含这样子目录的目录。

my_directory/  
├── surf_001/  
|     ├── a.xyz  
├── surf_002/.  
|     └── a.xyz  
├── surf_003/  
|     ├── a.xyz

我可以检索 surf_001 的 a.xyz,到目前为止我的代码看起来像这样

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 个文件

解决方法

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

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

>>> 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',flags=glob.GLOBSTAR | glob.EXTGLOB)
True

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

在你的情况下,你可能想要这样的东西:

from wcmatch import glob
file = '/home/sg/scratch/slabs/cool_100/surf_+([0-9])/a.xyz'
filenames = glob.glob(file,flags=glob.EXTGLOB)

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

>>> 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',flags=glob.GLOBSTAR | glob.BRACE)
False

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。