我有一个目录,其子目录如下所示。
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的文件夹
发布于 2021-02-22 14:50:51
对于内置的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', '**/surf_+([0-9])/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', '**/surf_{001..100}/a.xyz', flags=glob.GLOBSTAR | glob.BRACE)
False如果使用外部库不是一种选择,我相信将会有大量的答案来展示如何使用常规的glob来做到这一点,但我想他们可能不会那么简单。
https://stackoverflow.com/questions/66309542
复制相似问题