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
Trả lời
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')
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
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)
Đâ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
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
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
@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
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
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"))
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.
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? –
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. –