如何解决从不同的目录中检索相同的文件名例如 - 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 举报,一经查实,本站将立刻删除。