python에서 glob.glob를 사용하여 .txt, .mdown 및 .markdown과 같은 여러 파일 유형 목록을 얻는 더 좋은 방법이 있습니까? 지금 나는 이와 같은 것을 가지고있다 :
projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )
답변
더 좋은 방법이 있지만 어떻습니까?
import glob
types = ('*.pdf', '*.cpp') # the tuple of file types
files_grabbed = []
for files in types:
files_grabbed.extend(glob.glob(files))
# files_grabbed is the list of pdf and cpp files
다른 방법이있을 수 있으므로 다른 사람이 더 나은 답변을 얻을 수 있도록 기다립니다.
답변
from glob import glob
files = glob('*.gif')
files.extend(glob('*.png'))
files.extend(glob('*.jpg'))
print(files)
경로를 지정해야하는 경우 일치 패턴을 반복하고 단순성을 위해 루프 내부의 결합을 유지하십시오.
from os.path import join
from glob import glob
files = []
for ext in ('*.gif', '*.png', '*.jpg'):
files.extend(glob(join("path/to/dir", ext)))
print(files)
답변
glob
리스트를 반환합니다. 왜 여러 번 실행하고 결과를 연결하지 않습니까?
from glob import glob
ProjectFiles = glob('*.txt') + glob('*.mdown') + glob('*markdown')
답변
결과를 연결하십시오 :
import itertools as it, glob
def multiple_file_types(*patterns):
return it.chain.from_iterable(glob.iglob(pattern) for pattern in patterns)
그때:
for filename in multiple_file_types("*.txt", "*.sql", "*.log"):
# do stuff
답변
확장 프로그램 수만큼 여러 번 globbing을 제안하는 많은 답변을 대신 한 번만 globbing을 선호합니다.
from pathlib import Path
files = {p.resolve() for p in Path(path).glob("**/*") if p.suffix in [".c", ".cc", ".cpp", ".hxx", ".h"]}
답변
glob으로는 불가능합니다. 당신은 다음을 사용할 수 있습니다 :
* 모든 것과 일치
합니까? 모든 단일 문자와 일치
[seq] seq의 모든 문자와 일치
[! seq]는 seq에없는 모든 문자와 일치
os.listdir 및 regexp를 사용하여 패턴을 확인하십시오.
for x in os.listdir('.'):
if re.match('.*\.txt|.*\.sql', x):
print x
답변
예를 들어, 위해 *.mp3
및 *.flac
여러 폴더에, 당신은 할 수 있습니다 :
mask = r'music/*/*.[mf][pl][3a]*'
glob.glob(mask)
이 아이디어는 더 많은 파일 확장자로 확장 될 수 있지만 그 조합이 해당 폴더에있는 다른 원치 않는 파일 확장자와 일치하지 않는지 확인해야합니다. 따라서 조심 하십시오.
임의의 확장자 목록을 단일 glob 패턴으로 자동 결합하려면 다음을 수행하십시오.
mask_base = r'music/*/*.'
exts = ['mp3', 'flac', 'wma']
chars = ''.join('[{}]'.format(''.join(set(c))) for c in zip(*exts))
mask = mask_base + chars + ('*' if len(set(len(e) for e in exts)) > 1 else '')
print(mask) # music/*/*.[fmw][plm][3a]*
