2011-12-24 2 views
5

Trong Python trên hệ thống GNU/Linux, cách nhanh nhất để đệ quy quét thư mục cho tất cả các tệp .MOV hoặc .AVI và lưu trữ chúng trong một danh sách?Trong Python, cách nhanh nhất để xây dựng danh sách các tệp trong một thư mục với một số mở rộng nhất định

+1

Nhanh nhất có thể liên quan đến việc viết mở rộng để sử dụng mã gốc. Nhưng bạn có thực sự muốn điều đó không? –

+0

Thậm chí nếu bạn không muốn làm điều đó, tùy thuộc vào số lượng tệp và thư mục chúng ta đang nói đến, có thể thực hiện lệnh 'find' bên ngoài hơn là xử lý kết quả của' os.walk() '. Nhưng nếu giải pháp 'os.walk()' đủ nhanh, nó thanh lịch và dễ hiểu hơn. –

Trả lời

3

Ví dụ về danh sách tệp trong thư mục hiện tại. Bạn có thể mở rộng điều này cho các đường dẫn cụ thể.

import glob 
movlist = glob.glob('*.mov') 
7

Bạn có thể sử dụng os.walk() để đi bộ recuresive và glob.glob() hoặc fnmatch.filter() cho phù hợp với file:

Kiểm tra này answer

6

Tôi muốn sử dụng os .walk để quét thư mục, os.path.splitext để lấy hậu tố và tự lọc chúng.

suffixes = set(['.AVI', '.MOV']) 
for dirpath, dirnames, filenames in os.walk('.'): 
    for f in filenames: 
     if os.path.splitext(f)[1] in suffixes: 
      yield os.path.join(dirpath, f) 
+0

Đây có lẽ là giải pháp tốt nhất vì nó có thể dễ dàng thích nghi để thực thi khớp không phân biệt chữ hoa chữ thường. – ekhumoro

2
pattern = re.compile('.*\.(mov|MOV|avi|mpg)$') 

def fileList(source): 
    matches = [] 
    for root, dirnames, filenames in os.walk(source): 
     for filename in filter(lambda name:pattern.match(name),filenames): 
      matches.append(os.path.join(root, filename)) 
    return matches 
+0

Mô-đun [fnmatch] (http://docs.python.org/library/fnmatch.html#module-fnmatch) chỉ hỗ trợ các mẫu hình cầu rất đơn giản, vì vậy bộ lọc của bạn sẽ không hoạt động. – ekhumoro

+0

@ekhumoro nếu nó hoạt động, biểu tượng ([],.,?, *,()) Được phép phát ra, mã thử nghiệm python và xem mã nào hoạt động – Jhonathan

+0

Mẫu của bạn tương đương với '*. [MovMOVaipg()]'. Điều này sẽ khớp với, ví dụ: '* .i',' * .a', '* .M', v.v. nhưng _not_' * .MOV', '* .avi', v.v. Hãy thử nó cho chính bạn! – ekhumoro

1

Python 2.x:

import os 

def generic_tree_matching(rootdirname, filterfun): 
    return [ 
     os.path.join(dirname, filename) 
     for dirname, dirnames, filenames in os.walk(rootdirname) 
     for filename in filenames 
     if filterfun(filename)] 

def matching_ext(rootdirname, extensions): 
    "Case sensitive extension matching" 
    return generic_tree_matching(
     rootdirname, 
     lambda fn: fn.endswith(extensions)) 

def matching_ext_ci(rootdirname, extensions): 
    "Case insensitive extension matching" 
    try: 
     extensions= extensions.lower() 
    except AttributeError: # assume it's a sequence of extensions 
     extensions= tuple(
      extension.lower() 
      for extension in extensions) 
    return generic_tree_matching(
     rootdirname, 
     lambda fn: fn.lower().endswith(extensions)) 

Sử dụng một trong hai matching_ext hoặc matching_ext_ci với đối số thư mục gốc và một phần mở rộng hoặc một tuple các phần mở rộng:

>>> matching_ext(".", (".mov", ".avi")) 
1

Tôi đề nghị việc sử dụng os.walk và cẩn thận reading of its documentation.

Đây có thể là một cách tiếp cận một liner:

[f for root,dirs,files in os.walk('/your/path') for f in files if is_video(f)] 

đâu trong is_video bạn kiểm tra phần mở rộng của bạn.