2011-01-08 12 views
5

Kodumda, bir klasörün tamamını bir listeye yükledikten sonra .mp3 dosyaları dışındaki listedeki her dosyadan kurtulmayı deniyorum. Ben dosyayı çalıştırdıktan sonraNeden bu dizeler python'daki normal ifademden kaçıyor?

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 

, kod listesinde bazı dosyalar kurtulmak yok ama bu iki especifically tutar:

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

Ben neler olduğunu anlayamıyorum, neden şu ikisine vardır özellikle aramamdan kaçıyor.

cevap

4

Listenizi bir döngü içinde değiştiriyorsunuz. Bu sorunlara neden olabilir. Bunun yerine listenin bir kopyasını (for name in dirList[:]:) veya yeni bir liste oluşturmalısınız. Bir düzenli ifade etmeden,

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

aynı şey:

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

print modifiedDirList 

Hatta daha da iyisi, bir liste anlama kullanmak

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

Çok teşekkür ederim :) Ben python için yeni ve öğrenmek için bir sürü şey var! – marcoamorales

+0

Listenizdeki kavrayışlar saçmalıktır. – SilentGhost

+0

@SilentGhost - Anlamsız? Nasıl yani? – Seth

2

dirList.remove(names) numaralı telefonu aradığınızda, özgün yineleyici istediğiniz şeyi yapmaz. Listede bir kopyası üzerinde yineleme, bu beklendiği gibi çalışır: Alternatif

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

, doğru liste oluşturmak için list comprehensions kullanabilirsiniz:

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

belki glob modülünü kullanması gereken - işte tam metniniz:

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

'glob.iglob' mükemmel olurdu. – SilentGhost

+0

ve orada bir dizin adı girmeniz gerekiyor elbette. – SilentGhost