2011-01-08 2 views
5

W moim kodzie ładuję cały folder na listę, a następnie staram się pozbyć każdego pliku na liście z wyjątkiem plików .mp3.Dlaczego te ciągi są wymykane z mojego wyrażenia regularnego w pythonie?

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 

Po uruchomieniu pliku, kod musi pozbyć się niektórych plików na liście, ale zachowuje te dwa especifically:

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

nie mogę zrozumieć, co się dzieje, dlaczego te dwa w szczególności uciekając przed moimi poszukiwaniami.

Odpowiedz

4

Modyfikujesz swoją listę wewnątrz pętli. To może powodować problemy. Zamiast tego powinieneś przeliczyć kopię listy (for name in dirList[:]:) lub utworzyć nową listę.

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

print modifiedDirList 

Albo jeszcze lepiej użyć wyrażeń listowych:

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

samo, bez wyrażenia regularnego:

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

Dziękuję bardzo :) Jestem nowy dla Pythona i jest kilka rzeczy do nauczenia się! – marcoamorales

+0

Twoje zrozumienie listy to nonsens. – SilentGhost

+0

@SilentGhost - bzdury? Jak to? – Seth

2

Natychmiast po wywołaniu dirList.remove(names) oryginalny iterator nie robi tego, co chcesz. Jeśli iteracyjne nad kopią listy, to będzie działać zgodnie z oczekiwaniami:

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

Alternatywnie, można użyć list comprehensions skonstruować odpowiednią listę:

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

może trzeba zastosować moduł glob - tutaj jest cały skrypt:

>>> import glob 
>>> mp3s = sorted(glob.glob('*.mp3')) 
>>> print mp3s 
>>> print len(mp3s) 
+0

'glob.iglob' byłby idealny. – SilentGhost

+0

i oczywiście musisz tam umieścić nazwę katalogu. – SilentGhost

Powiązane problemy