2011-01-08 5 views
5

In meinem Code lade ich einen ganzen Ordner in eine Liste und versuche dann, alle Dateien in der Liste außer den .mp3-Dateien loszuwerden.Warum entgehen diese Strings meinem regulären Ausdruck in Python?

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 

Nachdem ich die Datei ausführen, kommt der Code loswerden einige Dateien in der Liste, sondern hält diese beiden Eigens:

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

Ich kann nicht verstehen, was los ist, warum sind diese beiden spezifisch meiner Suche entgeht.

Antwort

4

Sie ändern Ihre Liste innerhalb einer Schleife. Das kann Probleme verursachen. Sie sollten stattdessen eine Kopie der Liste durchlaufen (for name in dirList[:]:) oder eine neue Liste erstellen.

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

print modifiedDirList 

Oder noch besser, eine Liste Verständnis verwenden:

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

Die gleiche Sache, ohne einen regulären Ausdruck:

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

Vielen Dank :) Ich bin neu bei Python und es gibt eine Menge Dinge zu lernen! – marcoamorales

+0

Ihre Liste Comprehensions sind Unsinn. – SilentGhost

+0

@SilentGhost - Unsinn? Wie das? – Seth

2

Sobald Sie dirList.remove(names) aufrufen, tut der ursprüngliche Iterator nicht, was Sie wollen. Wenn Sie über eine Kopie der Liste iterieren, wird es wie erwartet:

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

Alternativ können Sie list comprehensions verwenden, um die richtige Liste zu erstellen:

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

vielleicht sollten Sie die glob-Modul verwenden - Hier ist das gesamte Skript:

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

'glob.iglob' wäre perfekt. – SilentGhost

+0

und Sie müssen natürlich einen Verzeichnisnamen eingeben. – SilentGhost

Verwandte Themen