2011-01-08 13 views
5

Nel mio codice, carico un'intera cartella in un elenco e poi provo a eliminare tutti i file nell'elenco tranne i file .mp3.Perché queste stringhe sfuggono dalla mia espressione regolare 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 

Dopo ho eseguito il file, il codice non sbarazzarsi di alcuni file nella lista, ma mantiene questi due especifically:

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

non riesco a capire cosa sta succedendo, perché sono quei due in particolare sfuggire alla mia ricerca.

risposta

4

Si sta modificando l'elenco all'interno di un ciclo. Ciò può causare problemi. Dovresti invece eseguire il loop su una copia dell'elenco (for name in dirList[:]:) o creare un nuovo elenco.

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

print modifiedDirList 

O, meglio ancora, utilizzare un elenco di comprensione:

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

La stessa cosa, senza un'espressione regolare:

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

Grazie mille :) Sono nuovo di Python e ci sono un sacco di cose da imparare! – marcoamorales

+0

le tue comprensioni delle liste sono insensate. – SilentGhost

+0

@SilentGhost - Sciocchezze? Come mai? – Seth

2

Non appena si chiama dirList.remove(names), l'iteratore originale non fa ciò che si desidera. Se eseguire iterazioni su una copia della lista, che funzionerà come previsto:

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

In alternativa, è possibile utilizzare list comprehensions per costruire la lista di destra:

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

forse si dovrebbe usare il modulo glob - qui è tutto il tuo script:

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

'glob.iglob' sarebbe perfetto. – SilentGhost

+0

e devi inserire un nome di directory, ovviamente. – SilentGhost

Problemi correlati