2009-06-05 46 views
30

Tôi đang cố gắng lấy danh sách tất cả các tệp nhật ký (.log) trong thư mục, bao gồm tất cả các thư mục con.Cách nhận tệp trong thư mục, bao gồm tất cả các thư mục con

+1

này đã được hỏi: http://stackoverflow.com/questions/837606/find-the-oldest-file-recursively-in- a-directory, cũng như một vài thư mục khác (tìm kiếm 'Python walk' trong hộp tìm kiếm) –

Trả lời

-1

Nếu bạn muốn liệt kê trong thư mục hiện hành, Bạn có thể sử dụng một cái gì đó như:

import os 

for e in os.walk(os.getcwd()): 
    print e 

Chỉ cần thay đổi

os.getcwd() 

đến con đường khác để có được kết quả đó.

+0

Câu trả lời này không giải quyết câu hỏi của OP và không liên quan đến hầu hết những người sẽ tìm kiếm cùng một câu trả lời. – Andrew

59
import os 
import os.path 

for dirpath, dirnames, filenames in os.walk("."): 
    for filename in [f for f in filenames if f.endswith(".log")]: 
     print os.path.join(dirpath, filename) 
+1

Nếu bạn muốn tìm kiếm trong một thư mục khác từ "." bạn có thể chuyển direcotry như sys.argv [1] và gọi os.walk (sys.argv [1]). –

+2

Cải tiến bổ sung: Sử dụng trình tạo thay vì đọc danh sách: đối với tên tệp trong (f cho f ...) –

+1

Nếu bạn muốn loại trừ một thư mục nhất định, ví dụ 'old_logs', bạn có thể xóa nó khỏi' dirnames' và nó sẽ không được tìm kiếm: 'if 'old_logs" trong dirnames: dirnames.remove ("old_logs") ' – CGFoX

6

Bạn cũng có thể sử dụng mô-đun glob cùng với os.walk.

import os 
from glob import glob 

files = [] 
start_dir = os.getcwd() 
pattern = "*.log" 

for dir,_,_ in os.walk(start_dir): 
    files.extend(glob(os.path.join(dir,pattern))) 
+0

Các dấu gạch dưới làm gì trong vòng lặp for? '_' –

+1

@nueverest 'os.walk' trả về một 3-tuple' (dirpath, dirnames, filenames) 'tại mỗi lần lặp, và chúng ta chỉ quan tâm đến' dirpath' (được gán cho 'dir' ở trên); dấu gạch dưới chỉ được sử dụng như phần giữ chỗ cho 2 giá trị khác mà chúng ta không quan tâm (tức là 'dirnames', và sau đó' filenames', được gán cho biến '_', mà chúng ta sẽ không bao giờ sử dụng). – tavnab

0

Tôi có một giải pháp:

import os 
for logfile in os.popen('find . -type f -name *.log').read().split('\n')[0:-1]: 
     print logfile 

hoặc

import subprocess 
(out, err) = subprocess.Popen(["find", ".", "-type", "f", "-name", "*.log"], stdout=subprocess.PIPE).communicate() 
for logfile in out.split('\n')[0:-1]: 
    print logfile 

Hai mất lợi thế của find . -type f -name *.log.

Người đầu tiên là đơn giản hơn nhưng không được bảo đảm cho trắng-không gian khi thêm -name *.log, nhưng làm việc tốt cho đơn giản find ../testdata -type f (trong môi trường OS X của tôi).

Phương thức thứ hai sử dụng tiến trình con dường như phức tạp hơn, nhưng đây là an toàn không gian trắng (một lần nữa, trong môi trường OS X của tôi).

này được lấy cảm hứng từ Chris Bunch, trong câu trả lời https://stackoverflow.com/a/3503909/2834102

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