2010-09-21 46 views
7

Tôi có mã Python sau để xóa các tệp trong một thư mục. Vì một số lý do, thư mục .svn của tôi không được nhận dạng là thư mục.Python không nhận ra các thư mục os.path.isdir()

Và tôi nhận được kết quả như sau:

svn không phải là một dir

Bất kỳ ý tưởng sẽ được đánh giá.

def rmfiles(path, pattern): 
    pattern = re.compile(pattern) 
    for each in os.listdir(path): 
     if os.path.isdir(each) != True: 
      print(each + " not a dir") 
      if pattern.search(each): 
       name = os.path.join(path, each) 
       os.remove(name) 

Trả lời

27

Bạn cần phải tạo tên đường dẫn đầy đủ trước khi kiểm tra:

if not os.path.isdir(os.path.join(path, each)): 
    ... 
+0

Tôi đã dành một chút thời gian cho vấn đề này và hóa ra tôi cần sử dụng os.path.join(). Cảm ơn vì tiền boa. –

1

Bạn sẽ cần phải os.path.join đường dẫn mà bạn gọi listdir trên với các tập tin/thư mục được tìm thấy, tức là

for each in os.listdir(path): 
    if os.path.isdir(os.path.join(path, each)): 
     .... 

Nếu bạn không tạo đường dẫn tuyệt đối theo cách này, bạn sẽ kiểm tra thư mục làm việc hiện tại của bạn thay vì có thể không có thư mục svn.

Ngoài ra, không so sánh rõ ràng giá trị boolean. Hãy để xử lý nó như là một biểu thức boolean (một số hàm có thể trả về giá trị true/False true, ví dụ: None hoặc instance)

+0

Có một phương pháp gọi là abspath trong ospath, nhưng điều này cũng không có tác dụng với tôi. Bạn có biết tại sao điều này sẽ không hoạt động? – vargonian

0

Bạn cũng có thể chuyển sang thư mục đích thay vì xây dựng đường dẫn tuyệt đối.

def rmfiles(path, pattern): 
    pattern = re.compile(pattern) 
    oldpath = os.getcwd()  # <-- 
    os.chdir(path)   # <-- 
    try: 
     for each in os.listdir('.'): 
     if os.path.isdir(each) != True: 
      print(each + " not a dir") 
      if pattern.search(each): 
       name = os.path.join(path, each) 
       os.remove(name) 
    finally: 
     os.chdir(oldpath)  # <-- 
Các vấn đề liên quan