2017-09-06 13 views
2

나는 find $DIR -iname '*.mp3'과 동등한 것을 찾고 있는데, 나는 괴짜 ['mp3', 'Mp3', MP3', etc] 것을하고 싶지 않습니다. 그러나 re*.IGNORECASE 항목을 간단한 endswith() 방법으로 결합하는 방법을 알 수는 없습니다. 내 목표는 하나의 파일을 놓치지 않고 다른 미디어/파일 유형/접미어로이 파일을 확장하고 싶습니다. 어떤 의견에 대한어떻게 파이썬에서 주어진 접미사의 파일을 대/소문자를 구분하지 않고 검색합니까?

import os 
import re 
suffix = ".mp3" 

mp3_count = 0 

for root, dirs, files in os.walk("/Volumes/audio"): 
    for file in files: 
     # if file.endswith(suffix): 
     if re.findall('mp3', suffix, flags=re.IGNORECASE): 
      mp3_count += 1 

print(mp3_count) 

TIA

+0

정규식 솔루션이어야합니까? 왜'pathlib.Path (file) .suffix.lower() == '.mp3''가 아닌가? –

답변

1

당신은 시도 할 수 있습니다이 :

import os 
# import re 
suffix = "mp3" 

mp3_count = 0 

for root, dirs, files in os.walk("/Volumes/audio"): 
    for file in files: 
     # if file.endswith(suffix): 
     if file.split('.')[-1].lower() == suffix: 
      mp3_count += 1 

print(mp3_count) 

파이썬의 string.split() 주어진 어떤 매개 변수에 따라리스트로 문자열을 분리하는 것입니다, 당신은에 액세스 할 수 있습니다 접미사 [-1], 목록의 마지막 요소

+0

감사. 간단하고, 실제로 일할 수있는 유일한 제안이었습니다. – MagicToaster

1

os.walk으로 고민하지 마십시오. 대신 the easier, awesome pathlib.Path을 사용하는 방법을 배우십시오. 그래서 같이 :

from pathlib import Path 

suffix = ".mp3" 

mp3_count = 0 

p = Path('Volumes')/'audio': # note the easy path creation syntax 
# OR even: 
p = Path()/'Volumes'/'audio': 

for subp in p.rglob('*'): # recursively iterate all items matching the glob pattern 
    # .suffix property refers to .ext extension 
    ext = subp.suffix 
    # use the .lower() method to get lowercase version of extension 
    if ext.lower() == suffix: 
     mp3_count += 1 

print(mp3_count) 

"한 줄", 당신이 그런 종류의 물건에 있다면 (명확성을 위해 여러 줄) :

sum([1 for subp in (Path('Volumes')/'audio').rglob('*') 
    if subp.suffix.lower() == suffix]) 
+0

'iterdir()'대신'.rglob()'를 사용하기 위해 @Rawing이 제안한 위대한 제안. 그 대신 해답을 편집했습니다. –

0

.endswith의 정규식에 해당이 $ 기호입니다.

위 예제를 사용하려면이 작업을 수행 할 수 있습니다.

re.findall('mp3$', suffix, flags=re.IGNORECASE): 

이렇게하는 것이 더 정확할 수도 있지만, 파일 이름이 아니라 같은 test.amp3로 파일을 따기보다 .mp3로 끝나는 있는지 확인합니다

re.findall(r'\.mp3$', suffix, flags=re.IGNORECASE): 

.

이것은 정규 표현식을 필요로하지 않는 상황을 보여주는 좋은 예입니다. 따라서이 예제에서 배우는 것을 환영하지만 다른 응답자가 제공하는 대안을 고려해 볼 가치가 있습니다.