2011-01-08 6 views
5

내 코드에서 전체 폴더를 목록에로드 한 다음 .mp3 파일을 제외한 목록의 모든 파일을 제거하려고합니다. 내가 파일을 실행 한 후파이썬에서 이러한 문자열이 내 정규 표현식에서 벗어나는 이유는 무엇입니까?

import os 
import re 
path = '/home/user/mp3/' 
dirList = os.listdir(path) 
dirList.sort() 
i = 0 
for names in dirList: 
    match = re.search(r'\.mp3', names) 
    if match: 
    i = i+1 
    else: 
    dirList.remove(names) 
print dirList 
print i 

, 코드 목록의 일부 파일을 없애 않지만이 두 especifically 유지 :

['00. Various Artists - Indie Rock Playlist October 2008.m3u', '00. Various Artists - Indie Rock Playlist October 2008.pls']

내가 무슨 일이 일어나고 있는지 이해할 수 없다, 왜 그 두 가지이다 특히 내 검색에서 탈출.

답변

4

루프 내에서 목록을 수정하고 있습니다. 이로 인해 문제가 발생할 수 있습니다. 대신 목록의 복사본을 반복하거나 (for name in dirList[:]:) 새 목록을 만들어야합니다. 정규 표현식없이,

dirList = [name for name in sorted(os.listdir(path)) 
      if re.search(r'\.mp3', name)] 

같은 일 :

modifiedDirList = [] 
for name in dirList: 
    match = re.search(r'\.mp3', name) 
    if match: 
     i += 1 
     modifiedDirList.append(name) 

print modifiedDirList 

심지어 더 나은, 지능형리스트를 사용

dirList = [name for name in sorted(os.listdir(path)) 
      if name.endswith('.mp3')] 
+0

대단히 고마워요. 저는 파이썬에 익숙하지 않습니다. 배울 점이 많습니다! – marcoamorales

+0

귀하의 목록 내러티브는 의미가 없습니다. – SilentGhost

+0

@SilentGhost - 말도 안돼? 어떻게 그렇게? – Seth

2

dirList.remove(names)으로 전화하자마자 원래의 반복기는 원하는 것을 수행하지 않습니다. 이 목록의 사본을 반복하면 예상대로 작동합니다 : 또는

for names in dirList[:]: 
    .... 

, 당신은 오른쪽 목록 구축 list comprehensions를 사용할 수 있습니다

dirList = [name for name in dirList if re.search(r'\.mp3', name)] 
3

어쩌면 당신은 글로브 모듈을 사용한다을 - 전체 스크립트는 다음과 같습니다.

+0

'glob.iglob'는 완벽 할 것입니다. – SilentGhost

+0

그리고 거기에 디렉토리 이름을 넣어야합니다. – SilentGhost

관련 문제