2011-01-08 34 views
5

Trong mã của tôi, tôi tải toàn bộ thư mục vào một danh sách và sau đó cố gắng loại bỏ mọi tệp trong danh sách ngoại trừ tệp .mp3.Tại sao các chuỗi này thoát khỏi biểu thức chính quy của tôi trong 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 

Sau khi tôi chạy các tập tin, các mã này thoát khỏi một số tập tin trong danh sách nhưng giữ hai especifically:

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

Tôi không thể hiểu được những gì đang xảy ra, tại sao hai cụ thể thoát khỏi tìm kiếm của tôi.

Trả lời

4

Bạn đang sửa đổi danh sách của mình trong vòng lặp. Điều đó có thể gây ra vấn đề. Thay vào đó, bạn nên lặp lại bản sao của danh sách (for name in dirList[:]:) hoặc tạo danh sách mới.

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

print modifiedDirList 

Hoặc thậm chí tốt hơn, sử dụng một danh sách hiểu:

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

Các điều tương tự, mà không có một biểu thức chính quy:

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

Cảm ơn bạn rất nhiều :) Tôi mới đến python và có rất nhiều thứ để học! – marcoamorales

+0

việc hiểu danh sách của bạn là vô nghĩa. – SilentGhost

+0

@SilentGhost - Vô nghĩa? Làm thế nào? – Seth

2

Ngay khi bạn gọi dirList.remove(names), trình lặp ban đầu không thực hiện những gì bạn muốn. Nếu bạn lặp qua một bản sao của danh sách, nó sẽ làm việc như mong đợi:

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

Ngoài ra, bạn có thể sử dụng list comprehensions để xây dựng danh sách bên phải:

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

có lẽ bạn nên sử dụng các mô-đun glob - đây là toàn bộ tập lệnh:

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

'glob.iglob' sẽ được hoàn hảo. – SilentGhost

+0

và bạn cần phải đặt tên thư mục trong đó, tất nhiên. – SilentGhost

Các vấn đề liên quan