web-dev-qa-db-ja.com

glob exclude pattern

内部に多数のファイルがあるディレクトリがあります:eee2314asd3442 ...およびeph

eph関数でglobで始まるすべてのファイルを除外したい。

どうすればいいですか?

64

Globのパターンルールは正規表現ではありません。代わりに、標準のUnixパス拡張ルールに従います。少数の特殊文字のみがあります。2つの異なるワイルドカード、および文字範囲がサポートされています[from glob ]。

そのため、パターンを持つファイルを除外できます。
たとえば、globでマニフェストファイル(_で始まるファイル)を除外するには、次を使用できます。

files = glob.glob('files_path/[!_]*')
91
zety

glob関数を使用してパターンを除外することはできません。グロブはinclusionパターンのみを許可します。 グロビング構文 は非常に制限されています([!..]文字クラスmustは文字と一致するため、包含パターンクラスにないすべてのキャラクターに対して)。

独自のフィルタリングを行う必要があります。リスト内包表記は通常ここでうまく機能します:

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

セットを差し引くことができます:

set(glob("*")) - set(glob("eph*"))
34
neutrinus

ゲームに遅れましたが、代わりにpython filterglobの結果に適用することもできます:

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

またはラムダを適切な正規表現検索などに置き換えます...

編集:フルパスを使用している場合は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']
4
K Raphael

より一般的には、一部のシェル正規表現に準拠していないファイルを除外するには、モジュール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)

上記は、最初に指定されたパスからリストを生成し、次に目的の制約で正規表現を満たさないファイルをポップアウトします。

2

フォルダ内のすべてのファイルを繰り返し処理しながら特定のファイルをスキップしてください。以下のコードは、「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)

このようにして、より複雑な正規表現パターンを使用して、フォルダー内の特定のファイルセットを含める/除外することができます。

2
Azhar Ansari

globと比較して、pathlibをお勧めします。1つのパターンをフィルター処理するのは非常に簡単です。

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で始まるファイルをすべてフィルタリングできます。

2
Scott Ming

受け入れられた答えで述べたように、globのパターンを除外することはできません。そのため、以下はglobの結果をフィルタリングする方法です。

受け入れられた答えはおそらく物事を行うための最良のPythonの方法ですが、リストの内包表記が少しlookいと思われ、コードを最大限に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*"))

(私の場合、いくつかの画像フレーム、バイアスフレーム、およびフラットフレームがすべて1つのディレクトリにあり、画像フレームが必要でした)

1
Ryan Farber

以下の方法を使用できます。

# 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.  
0
KK2491