[Solved] glob exclude pattern

I have a directory with a bunch of files inside: eee2314, asd3442 … and eph.

I want to exclude all files that start with eph with the glob function.

How can I do it?

Solution #1:

The pattern rules for glob are not regular expressions. Instead, they follow standard Unix path expansion rules. There are only a few special characters: two different wild-cards, and character ranges are supported [from pymotw: glob – Filename pattern matching].

So you can exclude some files with patterns.
For example to exclude manifests files (files starting with _) with glob, you can use:

files = glob.glob('files_path/[!_]*')
Respondent: Kenly

Solution #2:

You can deduct sets:

set(glob("*")) - set(glob("eph*"))
Respondent: neutrinus

Solution #3:

You can’t exclude patterns with the glob function, globs only allow for inclusion patterns. Globbing syntax is very limited (even a [!..] character class must match a character, so it is an inclusion pattern for every character that is not in the class).

You’ll have to do your own filtering; a list comprehension usually works nicely here:

files = [fn for fn in glob('somepath/*.txt') 
         if not os.path.basename(fn).startswith('eph')]
Respondent: Martijn Pieters

Solution #4:

Late to the game but you could alternatively just apply a python filter to the result of a glob:

files = glob.iglob('your_path_here')
files_i_care_about = filter(lambda x: not x.startswith("eph"), files)

or replacing the lambda with an appropriate regex search, etc…

EDIT: I just realized that if you’re using full paths the startswith won’t work, so you’d need a regex

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']
Respondent: K Raphael

Solution #5:

Compare with glob, I recommend pathlib, filter one pattern is very simple.

from pathlib import Path

p = Path(YOUR_PATH)
filtered = [x for x in p.glob("**/*") if not x.name.startswith("eph")]

and if you want to filter more complex pattern, you can define a function to do that, just like:

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)]

use that code, you can filter all files that start with eph or start with epi.

Respondent: Scott Ming

Solution #6:

How about skipping the particular file while iterating over all the files in the folder!
Below code would skip all excel files that start with ‘eph’

import glob
import re
for file in glob.glob('*.xlsx'):
    if re.match('eph.*.xlsx',file):
        continue
    else:
        #do your stuff here
        print(file)

This way you can use more complex regex patterns to include/exclude a particular set of files in a folder.

Respondent: Azhar Ansari

Solution #7:

More generally, to exclude files that don’t comply with some shell regexp, you could use module fnmatch:

import fnmatch

file_list = glob('somepath')    
for ind, ii in enumerate(file_list):
    if not fnmatch.fnmatch(ii, 'bash_regexp_with_exclude'):
        file_list.pop(ind)

The above will first generate a list from a given path and next pop out the files that won’t satisfy the regular expression with the desired constraint.

Respondent: Lord Henry Wotton

Solution #8:

As mentioned by the accepted answer, you can’t exclude patterns with glob, so the following is a method to filter your glob result.

The accepted answer is probably the best pythonic way to do things but if you think list comprehensions look a bit ugly and want to make your code maximally numpythonic anyway (like I did) then you can do this (but note that this is probably less efficient than the list comprehension method):

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*"))

(In my case, I had some image frames, bias frames, and flat frames all in one directory and I just wanted the image frames)

Respondent: Ryan Farber

Solution #9:

If the position of the character isn’t important, that is for example to exclude manifests files (wherever it is found _) with glob and reregular expression operations, you can use:

import glob
import re
for file in glob.glob('*.txt'):
    if re.match(r'.*_.*', file):
        continue
    else:
        print(file)

Or with in a more elegant way – list comprehension

filtered = [f for f in glob.glob('*.txt') if not re.match(r'.*_.*', f)]

for mach in filtered:
    print(mach)

Solution #10:

You can use the below method:

# 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.  
Respondent: KK2491

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published. Required fields are marked *

New ride at Perth's Adventure World a ‘swing on steroids’ - Australasian Leisure Management npp pharma the truth about anabolic steroid drugs and professional sports