我有一个目录,里面有一堆文件:eee2314
,asd3442
...和eph
。
我想排除所有eph
以该glob
功能开头的文件。
我该怎么做?
我有一个目录,里面有一堆文件:eee2314
,asd3442
...和eph
。
我想排除所有eph
以该glob
功能开头的文件。
我该怎么做?
Answers:
glob的模式规则不是正则表达式。相反,它们遵循标准的Unix路径扩展规则。仅有几个特殊字符:支持两种不同的通配符,并且支持字符范围[from glob ]。
因此,您可以排除某些带有模式的文件。
例如,要排除清单文件(以开头的文件_
)和glob,可以使用:
files = glob.glob('files_path/[!_]*')
eph
但可以以任何其他开头的文件。[!e][!p][!h]
会过滤掉eee
以例如开头的文件。
您可以扣除集合:
set(glob("*")) - set(glob("eph*"))
set(glob("*")) - set(glob("eph*"))
并注意*在“ eph *”的末尾)
list(set(glob("*")) - set(glob("eph")))
您不能使用该glob
功能排除模式,Glob仅允许包含模式。通配符语法非常有限(即使[!..]
字符类也必须与字符匹配,所以它是一个对于不在类中的每个字符,包含模式)。
您必须自己进行过滤;列表理解通常在这里很有效:
files = [fn for fn in glob('somepath/*.txt')
if not os.path.basename(fn).startswith('eph')]
iglob
此处避免将完整列表存储在内存中
iglob
产生列表;您要做的只是懒惰地评估过滤器。这无助于减少内存占用。
os.listdir()
迭代时最多将一个结果保存在内存中。但是somepath/*.txt
必须读取内存中一个目录中的所有文件名,然后将该列表缩小为仅匹配的文件名。
glob.glob(x) = list(glob.iglob(x))
。没有太多的开销,但还是很高兴知道。
游戏晚了,但是您也可以将pythonfilter
应用于结果glob
:
files = glob.iglob('your_path_here')
files_i_care_about = filter(lambda x: not x.startswith("eph"), files)
或将Lambda替换为适当的正则表达式搜索等。
编辑:我只是意识到,如果您使用完整路径startswith
将无法正常工作,因此您需要一个正则表达式
In [10]: a
Out[10]: ['/some/path/foo', 'some/path/bar', 'some/path/eph_thing']
In [11]: filter(lambda x: not re.search('/eph', x), a)
Out[11]: ['/some/path/foo', 'some/path/bar']
如何在遍历文件夹中的所有文件时跳过特定文件!下面的代码将跳过所有以'eph'开头的Excel文件
import glob
import re
for file in glob.glob('*.xlsx'):
if re.match('eph.*\.xlsx',file):
continue
else:
#do your stuff here
print(file)
这样,您可以使用更复杂的正则表达式模式在文件夹中包含/排除一组特定的文件。
与glob
,我建议比较一下,pathlib
过滤一个模式很简单。
from pathlib import Path
p = Path(YOUR_PATH)
filtered = [x for x in p.glob("**/*") if not x.name.startswith("eph")]
如果要过滤更复杂的模式,可以定义一个函数来执行此操作,就像:
def not_in_pattern(x):
return (not x.name.startswith("eph")) and not x.name.startswith("epi")
filtered = [x for x in p.glob("**/*") if not_in_pattern(x)]
使用该代码,您可以过滤以eph
或开头的所有文件epi
。
如公认的答案所述,您不能使用glob排除模式,因此以下是一种过滤glob结果的方法。
公认的答案可能是最好的pythonic做事方式,但是如果您认为列表理解看起来有些丑陋,并且无论如何都想使代码最大化numpythonic(就像我一样),那么您可以这样做(但是请注意,这可能效率较低)比列表理解方法):
import glob
data_files = glob.glob("path_to_files/*.fits")
light_files = np.setdiff1d( data_files, glob.glob("*BIAS*"))
light_files = np.setdiff1d(light_files, glob.glob("*FLAT*"))
(以我为例,我在一个目录中有一些图像帧,偏置帧和平面帧,而我只想要这些图像帧)
如果字符的位置并不重要,那就是例如排除清单文件(无论它被发现_
),与glob
和re
-正则表达式的操作,您可以使用:
import glob
import re
for file in glob.glob('*.txt'):
if re.match(r'.*\_.*', file):
continue
else:
print(file)
或者以一种更优雅的方式- list comprehension
filtered = [f for f in glob.glob('*.txt') if not re.match(r'.*\_.*', f)]
for mach in filtered:
print(mach)
您可以使用以下方法:
# Get all the files
allFiles = glob.glob("*")
# Files starting with eph
ephFiles = glob.glob("eph*")
# Files which doesnt start with eph
noephFiles = []
for file in allFiles:
if file not in ephFiles:
noephFiles.append(file)
# noepchFiles has all the file which doesnt start with eph.
Thank you.