전역 제외 패턴
내부에 파일이 여러 개 있는 디렉토리가 있습니다.eee2314
,asd3442
...그리고.eph
.
다음으로 시작하는 모든 파일을 제외합니다.eph
와 함께glob
기능.
어떻게 해야 하나요?
글로벌에 대한 패턴 규칙은 정규식이 아닙니다.대신 표준 유닉스 경로 확장 규칙을 따릅니다.특수 문자는 몇 개뿐입니다. 두 개의 다른 와일드카드와 문자 범위가 지원됩니다. [from pymotw: glob – Filename pattern matching].
따라서 패턴이 있는 일부 파일을 제외할 수 있습니다.
예를 들어 매니페스트 파일(다음으로 시작하는 파일)을 제외합니다._
glob을 사용하면 다음을 사용할 수 있습니다.
files = glob.glob('files_path/[!_]*')
집합을 차감하고 목록으로 다시 캐스팅할 수 있습니다.
list(set(glob("*")) - set(glob("eph*")))
패턴을 제외할 수 없습니다.glob
함수, 글로브는 포함 패턴만 허용합니다.글로빙 구문은 매우 제한적입니다.[!..]
문자 클래스는 문자와 일치해야 하므로 클래스에 없는 모든 문자에 대한 포함 패턴입니다.
직접 필터링을 수행해야 합니다. 목록 이해는 일반적으로 여기에서 잘 작동합니다.
files = [fn for fn in glob('somepath/*.txt')
if not os.path.basename(fn).startswith('eph')]
에 대한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
.
게임에 늦었지만 파이썬을 적용할 수도 있습니다.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']
폴더에 있는 모든 파일을 반복하는 동안 특정 파일을 건너뛰는 것은 어떻습니까!아래 코드는 '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)
이렇게 하면 더 복잡한 정규식 패턴을 사용하여 특정 파일 집합을 폴더에 포함/제외할 수 있습니다.
일반적으로 일부 셸 정규식과 맞지 않는 파일을 제외하려면 모듈을 사용할 수 있습니다.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)
위에서 먼저 지정된 경로에서 목록을 생성한 다음 원하는 제약 조건으로 정규식을 만족하지 않는 파일을 팝업합니다.
다음과 같은 디렉토리 구조를 가지고 있다고 가정합니다.
.
├── asd3442
├── eee2314
├── eph334
├── eph_dir
│ ├── asd330
│ ├── eph_file2
│ ├── exy123
│ └── file_with_eph
├── eph_file
├── not_eph_dir
│ ├── ephXXX
│ └── with_eph
└── not_eph_rest
full globs를 사용하여 pathlib 및 최상위 디렉터리 생성기를 사용하여 전체 경로 결과를 필터링할 수 있습니다.
i_want=(fn for fn in Path(path_to).glob('*') if not fn.match('**/*/eph*'))
>>> list(i_want)
[PosixPath('/tmp/test/eee2314'), PosixPath('/tmp/test/asd3442'), PosixPath('/tmp/test/not_eph_rest'), PosixPath('/tmp/test/not_eph_dir')]
pathlib 메서드 일치는 글로브를 사용하여 경로 개체를 일치시킵니다.지구본'**/*/eph*'
는 이이다시로작파는이일모어전경든체로로 모든 입니다.'eph'
.
또다음사수있다니습용할을 할 수 ..name
이 " 다키시귀"입니다.name.startswith('eph')
:
i_want=(fn for fn in Path(path_to).glob('*') if not fn.name.startswith('eph'))
파일만 원하는 경우 디렉터리가 없습니다.
i_want=(fn for fn in Path(path_to).glob('*') if fn.is_file() and not fn.match('**/*/eph*'))
# [PosixPath('/tmp/test/eee2314'), PosixPath('/tmp/test/asd3442'), PosixPath('/tmp/test/not_eph_rest')]
동일한 방법이 반복 글러브에 적용됩니다.
i_want=(fn for fn in Path(path_to).glob('**/*')
if fn.is_file() and not fn.match('**/*/eph*'))
# [PosixPath('/tmp/test/eee2314'), PosixPath('/tmp/test/asd3442'),
PosixPath('/tmp/test/not_eph_rest'), PosixPath('/tmp/test/eph_dir/asd330'),
PosixPath('/tmp/test/eph_dir/file_with_eph'), PosixPath('/tmp/test/eph_dir/exy123'),
PosixPath('/tmp/test/not_eph_dir/with_eph')]
승인된 답변에서 언급한 것처럼 glob으로 패턴을 제외할 수 없으므로 다음은 glob 결과를 필터링하는 방법입니다.
승인된 대답은 아마도 일을 하는 가장 좋은 비단결적인 방법일 것입니다. 하지만 만약 당신이 목록 이해가 약간 추하게 보이고 (나처럼) 당신의 코드를 최대로 마비시키는 것을 원한다면, 당신은 이것을 할 수 있습니다. (그러나 이것은 아마도 목록 이해 방법보다 덜 효율적일 것입니다.)
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)
정확한 단어를 제외하기 위해 사용자 지정 정규식 지시어를 구현할 수 있습니다. 그런 다음 빈 문자열로 대체합니다.glob
처리.
#!/usr/bin/env python3
import glob
import re
# glob (or fnmatch) does not support exact word matching. This is custom directive to overcome this issue
glob_exact_match_regex = r"\[\^.*\]"
path = "[^exclude.py]*py" # [^...] is a custom directive, that excludes exact match
# Process custom directive
try: # Try to parse exact match direction
exact_match = re.findall(glob_exact_match_regex, path)[0].replace('[^', '').replace(']', '')
except IndexError:
exact_match = None
else: # Remove custom directive
path = re.sub(glob_exact_match_regex, "", path)
paths = glob.glob(path)
# Implement custom directive
if exact_match is not None: # Exclude all paths with specified string
paths = [p for p in paths if exact_match not in p]
print(paths)
import glob
import re
"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ""
EXCLUDE = "/home/koosha/Documents/Excel"
files = glob.glob("/home/koosha/Documents/**/*.*" , recursive=True)
for file in files:
if re.search(EXCLUDE,file):
pass
else:
print(file)
언급URL : https://stackoverflow.com/questions/20638040/glob-exclude-pattern
'programing' 카테고리의 다른 글
오라클 저장 프로시저를 어떻게 인쇄합니까(디버깅 목적)? (0) | 2023.07.09 |
---|---|
SQL 서버에 날짜 저장 (0) | 2023.07.04 |
다른 워크북을 연 후 Excel이 매크로를 완료하지 않음 (0) | 2023.07.04 |
Visual Studio 2015에서 .sass 파일을 저장하여 컴파일하는 방법 (0) | 2023.07.04 |
권한 오류로 인해 실패할 경우 보석을 설치하거나 RubyGems를 업데이트하는 방법 (0) | 2023.07.04 |