内部に多数のファイルがあるディレクトリがあります:eee2314
、asd3442
...およびeph
。
eph
関数でglob
で始まるすべてのファイルを除外したい。
どうすればいいですか?
Globのパターンルールは正規表現ではありません。代わりに、標準のUnixパス拡張ルールに従います。少数の特殊文字のみがあります。2つの異なるワイルドカード、および文字範囲がサポートされています[from glob ]。
そのため、パターンを持つファイルを除外できます。
たとえば、globでマニフェストファイル(_
で始まるファイル)を除外するには、次を使用できます。
files = glob.glob('files_path/[!_]*')
glob
関数を使用してパターンを除外することはできません。グロブはinclusionパターンのみを許可します。 グロビング構文 は非常に制限されています([!..]
文字クラスmustは文字と一致するため、包含パターンクラスにないすべてのキャラクターに対して)。
独自のフィルタリングを行う必要があります。リスト内包表記は通常ここでうまく機能します:
files = [fn for fn in glob('somepath/*.txt')
if not os.path.basename(fn).startswith('eph')]
セットを差し引くことができます:
set(glob("*")) - set(glob("eph*"))
ゲームに遅れましたが、代わりにpython filter
をglob
の結果に適用することもできます:
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']
より一般的には、一部のシェル正規表現に準拠していないファイルを除外するには、モジュール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)
上記は、最初に指定されたパスからリストを生成し、次に目的の制約で正規表現を満たさないファイルをポップアウトします。
フォルダ内のすべてのファイルを繰り返し処理しながら特定のファイルをスキップしてください。以下のコードは、「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
をお勧めします。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
で始まるファイルをすべてフィルタリングできます。
受け入れられた答えで述べたように、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つのディレクトリにあり、画像フレームが必要でした)
以下の方法を使用できます。
# 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.