2011-01-08 4 views
5

En mi código, cargo una carpeta completa en una lista y luego trato de deshacerme de todos los archivos de la lista, excepto los archivos .mp3.¿Por qué estas cadenas escapan de mi expresión regular en 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 

después de ejecutar el archivo, el código se deshace de algunos archivos en la lista, pero mantiene estos dos especifically:

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

No puedo entender lo que está pasando, por qué son los dos escapando específicamente de mi búsqueda.

Respuesta

4

usted está modificando su lista dentro de un bucle. Eso puede causar problemas. En su lugar, debe recorrer una copia de la lista (for name in dirList[:]:) o crear una nueva lista.

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

print modifiedDirList 

O mejor aún, utilizar una lista de comprensión:

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

Lo mismo, sin una expresión regular:

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

Muchas gracias :) Soy nuevo en Python y ¡hay muchas cosas que aprender! – marcoamorales

+0

su lista de comprensiones no tiene sentido. – SilentGhost

+0

@SilentGhost - ¿Tonterías? ¿Cómo es eso? – Seth

2

Tan pronto como llame al dirList.remove(names), el iterador original no hace lo que desea. Si iterar sobre una copia de la lista, que funcionará como se esperaba:

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

Como alternativa, puede utilizar list comprehensions para construir la lista de la derecha:

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

tal vez debería usar el módulo glob - aquí está toda la escritura:

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

'glob.iglob' sería perfecto. – SilentGhost

+0

y necesita poner un nombre de directorio allí, por supuesto. – SilentGhost

Cuestiones relacionadas