내부에 eee2314
, asd3442
... 및 eph
.
나는로 시작하는 모든 파일을 제외 할 eph
과 glob
기능을.
어떻게하니?
내부에 eee2314
, asd3442
... 및 eph
.
나는로 시작하는 모든 파일을 제외 할 eph
과 glob
기능을.
어떻게하니?
답변:
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*"))
(말과 통지 * "엡 *")
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))
. 오버 헤드가 많지는 않지만 알아두면 좋습니다.
게임이 늦었지만 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']
와 비교 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
.
보다 일반적으로 일부 쉘 정규식을 준수하지 않는 파일을 제외하려면 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)
위의 코드는 먼저 주어진 경로에서 목록을 생성 한 다음 원하는 제약 조건으로 정규식을 충족하지 않는 파일을 표시합니다.
수락 된 답변에서 언급했듯이 glob으로 패턴을 제외 할 수 없으므로 다음은 glob 결과를 필터링하는 방법입니다.
받아 들여지는 대답은 아마도 일을하는 가장 좋은 비단뱀적인 방법 일 것입니다. 그러나 목록 이해가 약간 추악 해 보이고 어쨌든 (내가 한 것처럼) 코드를 최대한 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.